【问题标题】:PHP Error handlingPHP 错误处理
【发布时间】:2009-07-03 22:45:09
【问题描述】:

提前谢谢大家。

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

创建我自己的错误处理或使用已经制作的东西会更好吗?当然欢迎任何建议、提示和问题。我最终认为以某种方式向 PHP 注册错误处理程序是一种甜蜜,这样我只需要抛出错误,然后决定如何处理它以及是否继续。

编辑:抱歉,我应该提供有关我想要记录的错误类型的更多详细信息。我希望记录 2 种主要类型的错误:用户和框架。

对于用户错误,我的意思是诸如错误的 url (404)、对受限页面的非法访问等。我知道我可以重新路由到主页或者只是脱口而出一个 JavaScript 对话框,但我希望能够优雅地处理这些错误并在它们变得明显时添加更多用户错误。

框架错误是指无法连接到数据库、有人意外删除了数据库表或以某种方式删除了文件等。

另外,我将负责开发和实时服务器处理。

【问题讨论】:

  • 不是答案,但不要忘记处理开发/生产环境:)

标签: php


【解决方案1】:

我最终会认为它是甜蜜的 以某种方式注册错误处理程序 使用 PHP,所以我只需要 抛出错误,然后决定什么 处理它以及是否继续。

您完全可以做到这一点,使用 set_error_handler()set_exception_handler()

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

  • trigger_error() 与 throw new Exception 类似,都立即退出当前执行,只有 trigger_error() 不可捕获。
  • 您希望如何在开发环境中处理错误(显示在屏幕上?)与在生产环境中处理错误(记录日志并通过电子邮件发送?)
  • 您可以使用上述函数将错误“转换”为异常,反之亦然
  • 并非所有错误类型都可以使用自定义错误处理程序进行处理

【讨论】:

  • 谢谢,我不知道这些功能。对于开发服务器上的错误,我会根据错误类型和级别在屏幕(或萤火虫控制台)和实时服务器上的日志/电子邮件中脱口而出。
  • 我可能会将它与一些自定义异常类结合起来。
【解决方案2】:

以下是我通常会做的一些事情:

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

【讨论】:

  • 感谢您的提示。我从来没有想过在开发过程中像这样使用 set_error_handler() ,很有意义。
【解决方案3】:

在较大的网站上工作时,最好了解错误的历史,尤其是当测试人员或用户触发奇怪的用例时,事情很容易级联成意想不到的逻辑路径。

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

在开发过程中,我使用 Particletree 的 PHP 分析器将错误和其他相关数据记录到带有跟踪、消息和行的控制台。它很漂亮——不能说它的效率。它可以使代码膨胀,但是我的天哪,它可以是一个救生员,以纯文本了解错误发生的位置和方式。在处理诸如 SOAP Web 服务之类的事情时尤其有用,这些事情会像没有人的业务一样向您抛出异常。

我还发现提取调试日志并将其保持在全局范围内很有用,就像人们之前所说的那样,当您切换到生产环境时,您不会将各种脏衣服吐到寒冷的互联网空气中,因为您可以相对轻松地将调试器的输出更改为 sql 数据库、电子邮件或其他任何内容。

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

【讨论】:

  • 我以前使用过 PEAR 的 Log 类,我喜欢它的一件事是它可以处理许多不同的日志记录机制(电子邮件、数据库、文件、控制台等)。我正在考虑使用它来将错误记录到正确的位置。
【解决方案4】:

在上线之前,我在开发过程的关键阶段对我的项目进行了全面测试,检查我的错误日志(我使用 Plesk 控制面板)来跟踪 php 错误。

当项目上线时,在类或应用程序的关键阶段,我使用我构建的类发送错误或调试报告。它将错误报告发送到定义的电子邮件地址,其中包含关键信息,例如:日期时间、用户 ip、引用页面、完整 url 和我在触发/调用调试类时定义的简短说明。

我曾经强迫它写一个日志文件,但发现这既不安全,因为目录必须有一个 777 的 chmod,而且效率不高,因为我每次都必须访问最新的日志。通过向他们发送电子邮件给我,我会立即解决问题。

【讨论】:

  • 谢谢,我想构建它,以便它可以基于错误类型/级别登录。有些错误会被记录下来,有些会被记录下来,然后用户会看到一个错误页面,还有一些用户会得到一个错误页面,错误会被记录下来并会发送一封电子邮件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2015-07-05
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多