2009-07-03 85 views
5

谢谢你提前一个。PHP错误处理

我目前正在调整/改进我从头开始为我的公司编写的MVC框架。它比较新,所以它肯定是不完整的。我需要将错误处理整合到框架中(一切都应该有权访问错误处理),并且它应该能够处理不同类型和级别的错误(用户错误和框架错误)。我的问题是做这件事的最佳方式和最佳机制是什么?我知道PHP 5的异常处理和PEAR的不同的错误机制,但我从来没有使用过它们中的任何一个。我需要一些高效且易于使用的东西。

创建我自己的错误处理或使用已经创建的东西会更好吗?任何建议,提示,问题当然是受欢迎的。我最终会认为它以甜头来注册PHP的错误处理程序,所以我只需要抛出错误,然后决定如何处理它以及是否继续。

编辑:对不起,我应该提供关于我想记录的错误类型的更多细节。我正在寻找记录2种主要类型的错误:用户和框架。

对于用户错误,我的意思是诸如错误的URL(404),非法访问受限制的页面等。我知道我可以重新路由到主页或只是脱口而出JavaScript对话框,但我想成为能够明显地处理这些错误并添加更多的用户错误。

通过框架错误,我指的是,像无法连接到数据库,有人删除数据库表上意外或不小心删除文件等

另外,我会采取开发和实时服务器处理的照顾。

+0

不是答案,但不要忘记处理开发/生产environements :) – marcgg 2009-07-03 22:51:07

回答

5

我最终会觉得它的甜度 以某种方式登记错误处理程序 用PHP,这样我就只需要 抛出错误,然后决定什么 与它是否继续做。

你可以做到这一点,与set_error_handler()set_exception_handler()

错误处理没有“一个正确的方法”,但这里有一些需要考虑的事情。

  • trigger_error()类似于抛出新的Exception,因为它们都立即退出当前执行,只有trigger_error()不可捕捉。
  • 如何在开发环境(在屏幕上显示?)和生产环境(通过日志和电子邮件?)处理错误?
  • 您可以使用上述功能将错误转化为异常或恶意反之亦然
  • 并非所有的错误类型可以用自定义错误处理程序
+0

谢谢,我不知道这些功能。 对于开发服务器上的错误,我只会在屏幕上(或萤火虫控制台)脱口而出,并根据错误类型和级别在实时服务器上记录/发送电子邮件。 – 2009-07-06 15:18:04

+0

我可能会将它与一些自定义异常类耦合起来。 – 2009-07-08 14:53:39

5

这里处理的一些事情,我通常做的:

  • 使用全局配置设置或标志来开发板的切换提供和生产。
  • 当你有选择时,不要使用php错误:喜欢你自己的错误handeling异常。如果您使用的库不使用异常,请检测错误并抛出自己的异常。
  • 使用顶级异常捕获器以易于阅读的方式显示异常。如果您策略性地放置此try-catch-block,则不必注册全局异常处理程序。
  • 总是使用error_handeling(E_ALL | E_STRICT)
  • 使用set_error_handler()捕获PHP警告和通知,并暂停执行。这提前消除了很多错误,结果得到了非常可靠的代码。
  • 全局错误汉宁代码应该非常轻量级,以避免错误。处理全局错误处理程序时,递归总会有风险。
  • 如果系统处于生产模式,请不要显示任何详细信息:记录错误,并生成一个唯一标识符,供用户在提交错误或报告错误时引用。
+1

感谢您的提示。我从来没有想过在开发过程中使用set_error_handler(),这很有道理。 – 2009-07-06 15:20:07

2

在更大现场工作时,它最好是有错误的历史的理解,尤其是当事情可以很容易地级联到意想不到的逻辑路径时,测试者或用户触发一个奇怪的使用情况。

我倾向于在try catch块中构建,它能够记录错误并在致命的情况下暂停执行(并且用错误代码吐出向前的错误页面),或者在软错误,继续,但在我的错误日志中注意到它。大多数情况下,最终建立一个自定义的错误处理程序,因为我发现在扩大规模时存在太多的细微差别。

在开发过程中,我使用Particletree的PHP分析器将错误和其他相关数据记录到带有跟踪,消息和行的控制台。它很漂亮 - 不能说它的效率。它可以膨胀代码,但噢,我的好神,它可以是一个生活的节省,让他们明白错误发生的地点和方式。在处理诸如SOAP Web服务之类的东西时,它会特别有用,它会像没有人的公务员一样在您身上抛出异常。

我也发现抽象一个调试日志并保持全局是非常有用的,例如之前人们所说的,当你切换到生产环境时,你并没有将所有类型的脏衣服都扔进冷的互联网空气中,因为你可以相对容易地将调试器的输出更改为sql数据库或电子邮件或其他。

Particletree的探查:http://particletree.com/features/php-quick-profiler/

+0

我之前使用过PEAR的Log类,我喜欢的一件事是它可以处理许多不同的日志记录机制(电子邮件,数据库,文件,控制台等)。我正在考虑使用它来将错误记录到正确的位置。 – 2009-07-06 15:22:50

0

才去住我开发过程完全在关键阶段测试我的项目,检查我的错误日志(我用的Plesk控制面板)来跟踪PHP错误。

当一个项目是活的,在类或应用程序的关键阶段,我发送一个错误或调试报告使用我建立的类。它将错误报告发送到定义的电子邮件地址,其中包含关键信息,例如:datetime,user ip,引用页,完整url以及我在触发/调用调试类时定义的简短说明。

我用它来强制它写一个日志文件,但发现这两个都不安全,因为目录必须有一个777的chmod,并且效率不高,因为我每次都必须访问最新的日志。通过电邮给我,我马上解决问题。