CodeIgniter和抛出异常

cab*_*ret 23 php error-handling codeigniter exception

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

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

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

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

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

谢谢.

Ale*_*ias 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
}
Run Code Online (Sandbox Code Playgroud)

它不是很有用.与此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));
}
Run Code Online (Sandbox Code Playgroud)

您将看到这很有用,您不会抛出异常,它由处理记录保存的类抛出并$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());
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,在您检查的模型中,例如,如果记录插入失败,然后抛出包含验证错误的自定义异常.关于PHP中的自定义异常有一个问题:http://stackoverflow.com/questions/5008965/php-custom-exceptions (2认同)