做任何一种方式的优点/缺点是什么?有一条正确的方法(tm)?
如果要为整个应用程序使用异常而不是错误,可以使用ErrorException和自定义错误处理程序(请参阅ErrorException页面以获取示例错误处理程序).这种方法唯一的缺点是非致命错误仍会抛出异常,除非被捕获,否则这些异常总是致命的.基本上,E_NOTICE
如果你的error_reporting设置没有抑制它们,甚至会停止你的整个应用程序.
在我看来,使用ErrorException有几个好处:
使用set_exception_handler,自定义异常处理程序将允许您显示好消息,甚至是错误.
它不会以任何方式破坏现有代码...... trigger_error和其他错误函数仍然可以正常工作.
这使得忽略触发E_NOTICE
s和E_WARNING
s的愚蠢编码错误变得非常困难.
您可以使用try
/ catch
来包装可能生成PHP错误的代码(不仅仅是异常),这是一种避免使用@
错误抑制黑客的好方法:
try { $foo = $_GET['foo']; } catch (ErrorException $e) { $foo = NULL; }
如果要在发生任何未捕获的错误时向用户显示友好消息,可以将整个脚本包装在单个try
/ catch
块中.(请仔细执行此操作,因为只记录未捕获的错误和异常.)
你应该在"异常情况"中使用异常,也就是当你调用一个你应该期望它执行的方法doFoo()时,如果由于某种原因doFoo无法完成它的工作,那么它应该引发异常.
当发生故障时,许多旧的PHP代码会采用返回false或null的方法,但这使得调试变得困难,异常使得调试变得更加容易.
例如,假设你有一个名为getDogFood()的方法,它返回了一个DogFood对象数组,如果你调用了这个方法并且在出现错误时返回null,你的调用代码将如何判断是否返回了null,因为出现了错误还是没有狗食?
关于处理使用php内置错误日志记录的遗留代码库,您可以使用set_error_handler()函数覆盖错误日志记录,然后可以使用该函数重新抛出一般异常.
现在您已经将所有代码抛出了详细的异常,您可以自由决定如何处理它们,在代码的某些部分中,您可能希望捕获它们并尝试其他方法,或者您可以使用自己的日志记录函数来记录它们.可能会记录到数据库,文件,电子邮件 - 无论您喜欢哪个.简而言之 - 例外更灵活.
我喜欢使用异常的想法,但我经常涉及第三方库,如果他们不使用异常,你最终会遇到3-4种不同的问题方法!Zend使用例外.CakePHP使用自定义错误处理程序,大多数PEAR库使用PEAR :: Error对象.
我在这方面有一个真正的方法.在这种情况下,自定义错误处理程序路由可能是最灵活的.如果您只使用自己的代码或使用使用它们的库,则例外是一个好主意.
遗憾的是在PHP世界我们仍然拒绝痛苦死PHP4的,所以像例外,虽然他们可能代表最佳实践已经流行开来,而每个人都还在写的东西能在同时有4工作慢得令人难以置信5.希望这个崩溃现在已经结束,但到了它的时候,我们将会有6到5之间的紧张局势......
/我掌握在手中......