【问题标题】:Why no PHP error on call to undefined function?为什么调用未定义函数时没有 PHP 错误?
【发布时间】:2011-12-15 09:20:37
【问题描述】:

每当调用未定义的函数时,都不会记录任何错误。相反,脚本只是停止执行。更糟糕的是,如果我运行 php -l filename.php,它表明没有语法错误。我正在使用自定义错误处理函数,但即使是第一行也从未到达。

当调用未定义的函数时,如何让它运行我的错误处理程序?

我使用的是 PHP 5.3.2-1。这是设置错误处理程序的代码:

error_reporting(-1);
$old_error_handler = set_error_handler( "userErrorHandler" );
set_exception_handler('exception_handler');

错误处理程序和异常处理程序均未到达,尽管它们确实适用于其他错误。

我想要这个的原因是我最终不得不在我的代码中放置调试语句,以查看它在停止执行之前能走多远,与告诉我文件和行号的错误消息相比,这是一个缓慢的过程错误是。

【问题讨论】:

    标签: php error-reporting


    【解决方案1】:

    manual 中有一个相关的部分用于set_error_handler()

    以下错误类型无法使用用户定义的函数处理:E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_COMPILE_WARNING 以及文件中引发的大部分 E_STRICT其中set_error_handler() 被调用。

    【讨论】:

      【解决方案2】:

      用户错误处理程序无法捕获致命错误。

      http://php.net/manual/en/function.set-error-handler.php

      具体部分:

      以下错误类型无法用用户定义的方式处理 功能:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、 E_COMPILE_ERROR、E_COMPILE_WARNING 和大部分 E_STRICT 在 调用 set_error_handler() 的文件。

      根据 PHP 手册页上的 cmets,一种解决方法是测试关闭函数中的错误:

      <?php
          error_reporting(E_ALL);
          ini_set('display_errors', 0);
      
          function shutdown(){
              $isError = false;
              if ($error = error_get_last()){
                  switch($error['type']){
                      case E_ERROR:
                      case E_CORE_ERROR:
                      case E_COMPILE_ERROR:
                      case E_USER_ERROR:
                          $isError = true;
                          break;
                  }
              }
      
              if ($isError){
                  echo "Script execution halted ({$error['message']})";
              } else {
                  echo "Script completed";
              }
          }
      
          register_shutdown_function('shutdown');
      ?>
      

      【讨论】:

      • +1 表示完整性(“为什么 id 不起作用”和解决方法)
      • 此解决方法效果很好!我还根据您链接到的文档在 switch 语句中添加了以下情况:E_PARSE、E_COMPILE_WARNING、E_STRICT。根据文档,以这种方式捕获 E_STRICT 错误似乎有时会导致重复记录错误,但有必要记录所有错误。我基于文档说“大多数” E_STRICT 错误无法使用用户定义的函数来处理。
      • 此外,文档中不包含用户定义函数无法处理的错误类型列表中的 E_USER_ERROR,因此我从您发布的代码中删除了该案例。
      • 作为此解决方法的一部分,我还想从关闭函数内部调用我的自定义错误处理程序,以处理它尚未捕获的错误类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-15
      • 2016-02-20
      • 2014-07-21
      相关资源
      最近更新 更多