首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP error_get_last得到警告,尽管error_handling =1

问PHP error_get_last得到警告,尽管error_handling =1
EN

Stack Overflow用户
提问于 2014-09-02 22:03:54
回答 2查看 1.6K关注 0票数 0

所以在php.ini中,我设置了:

代码语言:javascript
复制
error_reporting  =  E_ERROR

我写了一个处理程序:

代码语言:javascript
复制
register_shutdown_function( "fatal_handler" );

function fatal_handler() {

  $errfile = "unknown file";
  $errstr  = "shutdown";
  $errno   = E_CORE_ERROR;
  $errline = 0;

  $error = error_get_last();

  if( $error !== NULL) {
    $errno   = $error["type"];
    $errfile = $error["file"];
    $errline = $error["line"];
    $errstr  = $error["message"];

    if($errno == E_ERROR){
      $html = 'some html here';
      print($html);
      die();
    }
  }
}

我为测试它所做的是在一个脚本中放置一个比max_execution_time更长的睡眠时间。由于某些原因,如果我在另一个选项卡中打开一个新的页面,同时加载故意损坏的页面,这也会杀死其他页面。没关系,但是当第二个页面崩溃时,它给了我一个error_get_last()的警告。但我将error_reporting设置为1!为什么要给我看警告?它不会记录它,但是它会导致我无法捕捉导致白屏幕的错误,这正是这段代码应该避免的事情!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-03 17:32:16

基本上,我采用了Evan的答案,并将其与this question's answer相结合,我得到了一个看似可行的解决方案。如果将myHandler设置为记录错误/警告,则error_reporting将捕获错误/警告并记录它们。然后返回true,这将防止警告进入error_get_last()。因此,现在error_get_last()调用应该只返回绕过错误处理程序的内容,例如E_ERROR。

代码语言:javascript
复制
register_shutdown_function('fatal_handler');
set_error_handler('myHandler');

function myHandler($errno, $errstr, $errfile, $errline, $errctx){
    if((error_reporting() & $errno) && ini_get('log_errors') == 'On'){
        error_log(getFriendlyErrorType($errno) . ':  ' . $errstr . ' in ' . $errfile . ' on line ' . $errline);
    }
    return true;
}

function fatal_handler() {
    $error = error_get_last();

    if($error !== NULL) {
        $errno   = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr  = $error["message"];

        if($errno == E_ERROR){
            $html = '[some html]';
            print($html);
            die();
        }
    }
}

function getFriendlyErrorType($type) 
{ 
    switch($type) 
    { 
        case E_ERROR: // 1 // 
            return 'PHP Error'; 
        case E_WARNING: // 2 // 
            return 'PHP Warning'; 
        case E_PARSE: // 4 // 
            return 'PHP Parse'; 
        case E_NOTICE: // 8 // 
            return 'PHP Notice'; 
        case E_CORE_ERROR: // 16 // 
            return 'PHP Core Error'; 
        case E_CORE_WARNING: // 32 // 
            return 'PHP Core Warning'; 
        case E_CORE_ERROR: // 64 // 
            return 'PHP Compile Error'; 
        case E_CORE_WARNING: // 128 // 
            return 'PHP Compile Warning'; 
        case E_USER_ERROR: // 256 // 
            return 'PHP User Error'; 
        case E_USER_WARNING: // 512 // 
            return 'PHP User Warning'; 
        case E_USER_NOTICE: // 1024 // 
            return 'PHP User Notice'; 
        case E_STRICT: // 2048 // 
            return 'PHP Strict Standards'; 
        case E_RECOVERABLE_ERROR: // 4096 // 
            return 'PHP Recoverable Error'; 
        case E_DEPRECATED: // 8192 // 
            return 'PHP Deprecated'; 
        case E_USER_DEPRECATED: // 16384 // 
            return 'PHP User Deprecated'; 
    } 
    return ''; 
} 
票数 1
EN

Stack Overflow用户

发布于 2014-09-02 22:21:22

无论是关闭处理程序还是error_get_last都不尊重error_reporting。

将始终调用关机处理程序,而不考虑任何错误或其级别(除非您在自定义错误处理程序中抛出异常)

error_get_last只给出了最后一个错误,不管它的级别如何。

与其使用关闭处理程序,为什么不使用错误处理程序呢?在这种情况下,如果要忽略该级别的错误,可以检查错误级别并返回FALSE。(返回FALSE告诉PHP继续正常进行)

代码语言:javascript
复制
set_error_handler("fatal_handler");

function fatal_handler($errno, $errstr, $errfile, $errline, $errctx)
{
    $reptLevel = error_reporting();

    if ($reptLevel > 0) //if $reptLevel = 0 then it means the code that caused the error was preceded by a supressor (example: $x = @someFunction())
    {
        if ($errno == E_ERROR)
        {
            $html = 'some html here';
            print($html);
            die();
        } else {
            return false;
        } 
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25633104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档