【发布时间】:2010-11-28 12:50:35
【问题描述】:
我是 PHP 的相对新手,但在我看来,PHP 的错误处理有点像贫民窟,错误和警告中穿插着异常(不要让我开始使用 die())。因此,我不确定如何最好地在我的应用程序中创建、解释和处理所有错误情况。
我的总体进攻计划大致如下:
- 将所有警告/错误转换为异常,使用
set_error_handler()在错误出现时对其进行包装。 - 防御性代码,抢先检查我预计会出错的事情。仅当我无法直接处理错误时才抛出异常。通常的
try/catch块将在需要时到位,以处理我不会自己抛出的异常。 - 将我的整个应用程序(即我的
index.php入口点文件)包装在它自己的try/catch中。如果失败,我会抛出一个HTTP 500并显示一个合适的错误页面。大概这个页面将是一个单独的预编译文件,而不是包含页眉/正文/页脚的集合——这主要是为了让我仍然可以涵盖奇怪的异常,比如乱码的模板文件。我想这就是为什么 Google 的 500 级错误页面看起来与他们发布的所有其他内容大不相同的原因。 - 作为 #2 和 #3 的必然结果,由于我希望预先处理所有事情,如果我决定抛出自己的异常,我也希望 not 捕获错误,而是让它一直冒泡到我的顶级处理程序。这里的想法是,如果我无法在它发生时处理它,我可能没有能力在其他任何地方处理它。我正在考虑给这些错误提供他们自己的子类 - 也许
CriticalErrorException- 可以直接在我的日志中识别/生成一封电子邮件,以便我可以快速查看它。一般来说,我希望这些是可能在开发中发生的事情,但应该在生产中解决。 - 任何出现在顶部的错误都会记录在数据库中,并通过故障转移到日志文件。如上所述,严重错误会触发电子邮件。如果报告故障转移到文件 - 即存在数据库错误 - 也会触发电子邮件。
我认为这很好地涵盖了大多数情况,但正如我所说,我对 PHP 很陌生,所以我不知道是否有我忽略的极端情况或奇怪的行为。
我的计划有什么缺陷?我该如何克服它们?
【问题讨论】:
-
这是一个可靠的方法,是的。
标签: php exception exception-handling error-handling