CodeIgniter 和抛出异常

Posted

技术标签:

【中文标题】CodeIgniter 和抛出异常【英文标题】:CodeIgniter and throwing exceptions 【发布时间】:2011-09-07 05:58:36 【问题描述】:

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

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

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

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

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

谢谢。

【问题讨论】:

可能感兴趣,这里的答案相当好:Why and how would you use Exceptions in this sample php code? 【参考方案1】:

仅供参考,我不会在 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());

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

【讨论】:

那么在“CI 的可能方法”中,您基本上会在模型中抛出自定义异常?我觉得我明白了;你的解释很有道理,尤其是当我看到与 Kohana 的比较时。非常感谢! 是的,在您检查的模型内部,例如,如果记录插入失败,然后抛出您的自定义异常,其中包含验证错误。 PHP中有一个关于自定义异常的问题:***.com/questions/5008965/php-custom-exceptions 我认为最好的做法是:#1 总是并且只在模型中抛出异常 #2 总是并且只在控制器中尝试/捕获它们。这样,一切都可以正常流畅地运行。

以上是关于CodeIgniter 和抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

python学习_异常和抛出

oracle plsql 捕获异常和抛出异常

java运行时异常和抛出异常的区别

JS异常捕获和抛出

捕获和抛出异常

Java中的异常的捕获和抛出是啥意思,有啥区别