CodeIgniter 和抛出异常
Posted
技术标签:
【中文标题】CodeIgniter 和抛出异常【英文标题】:CodeIgniter and throwing exceptions 【发布时间】:2011-09-07 05:58:36 【问题描述】:我最近提交了一个使用 CodeIgniter 构建的学校项目。我必须把它展示给我的老师,当被问及我如何处理某些错误时,他告诉我抛出异常以在事件链中更早地拦截事情。
我已经学会了如何抛出异常以及如何使用try...catch
块来捕获和处理它们,但是不知何故,当我开始使用 CodeIgniter 时,我完全忘记了它们并且不再真正使用异常。
相反,我只是“手动”处理了我的错误,因为没有更好的词:我会使用 TRUE
和 FALSE
布尔值来检查,例如,查询是否正确执行,我会使用返回的布尔值来处理查询的结果。如果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 和抛出异常的主要内容,如果未能解决你的问题,请参考以下文章