【问题标题】:How to catch all PHP errors?如何捕获所有 PHP 错误?
【发布时间】:2010-12-22 23:12:06
【问题描述】:

我需要一个解决方案来捕获所有 PHP 致命错误、异常、警告等并进行回调。

我想向用户显示错误的友好版本并记录该错误。

我正在考虑每天使用一个文本文件来记录错误。

有什么建议或 PHP 类(库)吗?

【问题讨论】:

    标签: php error-handling


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      这使得几乎所有错误都成为ErrorException 的可捕获实例:

      set_error_handler(function($errno, $errstr, $errfile, $errline ){
          throw new ErrorException($errstr, $errno, 0, $errfile, $errline);
      });
      

      在可能出现错误的代码之前使用它,例如在您的 php 文件的最顶部或包含的公共头文件中

      限制严重错误(PHP 引擎、服务器、语法)无法使用用户定义的函数处理:E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING 和大多数 E_STRICT 在 set_error_handler() 被调用的文件中提出的妥协它。

      但是,如果语法正确且服务器没有中断,则不应出现这些错误。

      如果需要,您可以使用 register_shutdown_function()error_get_last() 解决此问题

      【讨论】:

      【解决方案3】:

      尝试启动此网页,您应该会看到“消息:除以零”。

      // Set Error Handler
      
      set_error_handler (
          function($errno, $errstr, $errfile, $errline) {
              throw new ErrorException($errstr, $errno, 0, $errfile, $errline);     
          }
      );
      
      // Trigger an exception in a try block
      
      try {
          $a = 3/0;
          echo $a;
      }
      catch(Exception $e) {
          echo 'Message: ' .$e->getMessage();
      }
      

      【讨论】:

        【解决方案4】:

        从 PHP 7 开始,捕获所有异常的最佳方法是捕获 Throwable 接口,它“是可以通过 throw 语句抛出的任何对象的基本接口”。所以你的代码看起来像这样。

        try {
            # code...
        } catch (\Throwable $th) {
            # code...
        }
        

        【讨论】:

          【解决方案5】:

          我非常喜欢 kohana 框架的错误处理。不过,您必须做一些工作才能将其拔出。

          http://kohanaframework.org/

          它将允许您对文件进行错误记录并通过电子邮件发送给收件人。它还使您能够重定向到友好的错误页面。

          【讨论】:

            猜你喜欢
            • 2015-01-30
            • 2017-08-14
            • 1970-01-01
            • 1970-01-01
            • 2016-12-07
            • 1970-01-01
            • 2015-12-18
            • 2011-08-20
            • 2013-11-07
            相关资源
            最近更新 更多