php - CodeIgniter 和抛出异常

标签 php exception codeigniter error-handling

我最近提交了一个使用 CodeIgniter 构建的学校项目。我必须把它展示给我的老师,当被问及我如何处理某些错误时,他告诉我抛出异常以在事件链中更早地拦截事情。

我已经学会了如何抛出异常以及如何使用 try...catch block 来呃、捕获和处理它们,但是不知何故,当我开始使用 CodeIgniter 时,我忘记了它们并没有'不再真正使用异常了。

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

我似乎还记得在某处读过抛出异常并不是最好的做法,但我再也找不到它的来源,我不太确定是否是这种情况;毕竟,我们确实在类里面学会了如何使用它们,我相信我们在那里学到了最佳实践,哈哈。

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

谢谢。

最佳答案

仅供引用,我不在 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());
}

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

关于php - CodeIgniter 和抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6217786/

相关文章:

php - Yii urlManager - 动态 Controller 名称

java - 如果存在用户定义的构造函数,则无法使用默认构造函数

codeigniter - Doctrine 2 和 CodeIgniter 入门

php - 支付宝成功返回网址

datetime - PHP ini date.timezone?服务器或客户端位置时区?

ruby-on-rails - 如何修复 Ruby "no such file to load -- xsd/qname"错误?

Java Arrays.fill() 负数

php - 单选按钮已选中但未显示为已选中

php - 从数据库查询 php Codeigniter

php - 当 bundle 产品位于购物车中时,从 Woocommerce 中的购物车中删除子组件