CodeIgniter和抛出异常

时间:2011-06-02 17:13:25

标签: php exception codeigniter error-handling

我最近递交了一个我在CodeIgniter中建立的学校项目。我不得不把它呈现给我的老师,当被问及我是如何处理某些错误的时候,他告诉我在事件链中提出异常来拦截事情。

我已经学会了如何抛出异常以及如何使用try...catch块来捕获和处理它们但不知何故,当我开始使用CodeIgniter时,我忘记了它们并且不再使用异常了。

相反,我只是“手动”处理我的错误,因为缺少一个更好的词:我会使用TRUEFALSE布尔值来检查,例如,查询是否正确执行,我会使用返回的布尔值来处理查询的结果。如果TRUE,我会继续做我的事情,如果FALSE我'手动'抛出错误信息。该项目非常依赖于AJAX,错误消息会以相当奇特的方式弹出,从页面顶部开始下降;当我向throw new Exception抛出异常时,不确定这是否可行?我知道这基本上会阻止代码在抛出异常时执行,所以不会以某种方式破坏事情吗?

我似乎还记得在某个地方读过抛出异常并不是最好的做法,但我找不到这个的来源了,我不太确定是不是这样;毕竟,我们确实学会了如何在课堂上使用它们,我喜欢相信我们在那里学习最佳实践,哈哈。

如果有必要,我可以回去尝试找到他指出我应该抛出异常的代码。但是,就目前而言,我只是想知道我是否应该在代码中使用异常或手动处理事务。关于此的最佳做法是什么?

感谢。

1 个答案:

答案 0 :(得分:30)

仅供参考,我不会在CodeIgniter中使用异常,因为我在Kohana中使用了很多异常,因为框架会抛出它们,并且所有内容都设计为使用与CodeIgniter不同的异常。使用异常是一种很好的做法,只要您的所有类/框架都可以使用它们。

我(不,真的,不)想进入框架比较讨论,但我需要比较两段代码来澄清你的问题,一件来自CI2,另一件来自Kohana 3(它出生于CI的分支,具有更好的面向对象实现)。

你会看到这个CI2代码......

try
{
    $result = $this->db->insert('entries', $this->input->post());

    // This is not useful.
    if ( ! $result)
    {
        throw new Exception();
    }
}
catch (Exception $e)
{
    // Do something
}

这不是很有用。与此Kohana 3代码比较:

try
{
    $entry = ORM::factory('blog');
    $entry->values(Request::current()->post());
    $entry->save();
}
catch (ORM_Validation_Exception $e)
{
    Session::instance()->set('form_errors', $e->errors(TRUE));
}

你会发现这很有用,你不抛出异常,它由处理记录保存的类引发,$e->errors具有所有验证错误。当一切都被设计为与异常一起使用时,您可以确定这是一个很好的练习并且非常方便。但这不是CI2的情况,所以也许我应该说没有使用例外。


CI中例外的可能方法......

try
{
    $this->load->model('blog');
    $this->blog->save_entry($this->input->post());   // Handle validation inside the model with the Form_validation library
}
catch (Validation_Exception $e)   // You throwed your custom exception with the failed validation information
{
    // Do something with your custom exception like the kohana example
    $this->session->set('form_errors', $e->errors());
}

我希望一切都是可以理解的,也许有人有另一个有趣的意见和更有效的实施。再见。