代码之家  ›  专栏  ›  技术社区  ›  ganjan

自定义错误处理程序不处理严重错误(PHP)

  •  0
  • ganjan  · 技术社区  · 14 年前

    这是我的错误处理程序的主要部分:

    function my_error_handler($errno, $errstr, $errfile, $errline){
        $errno = $errno & error_reporting();
        if($errno == 0) return;
        if(!defined('E_STRICT'))            define('E_STRICT', 2048);
        if(!defined('E_RECOVERABLE_ERROR')) define('E_RECOVERABLE_ERROR', 4096);
    
        $error = ""; 
    
        switch($errno){
            case E_ERROR:               $error = $error."Error";                  break;
            case E_WARNING:             $error = $error."Warning";                break;
            case E_PARSE:               $error = $error. "Parse Error";            break;
            case E_NOTICE:              $error = $error. "Notice";                 break;
            case E_CORE_ERROR:          $error = $error. "Core Error";             break;
            case E_CORE_WARNING:        $error = $error. "Core Warning";           break;
            case E_COMPILE_ERROR:       $error = $error. "Compile Error";          break;
            case E_COMPILE_WARNING:     $error = $error. "Compile Warning";        break;
            case E_USER_ERROR:          $error = $error. "User Error";             break;
            case E_USER_WARNING:        $error = $error. "User Warning";           break;
            case E_USER_NOTICE:         $error = $error. "User Notice";            break;
            case E_STRICT:              $error = $error. "Strict Notice";          break;
            case E_RECOVERABLE_ERROR:   $error = $error. "Recoverable Error";      break;
            default:                    $error = $error. "Unknown error ($errno)"; break;
        }
        $error = " <i>$errstr</i> in <b>$errfile</b> on line <b>$errline</b><br /> \n";
        $gi = geoip_open("GeoIP/GeoLiteCity.dat",GEOIP_STANDARD);
    
        $ip = ip(); 
    
        $user = $_SESSION["username"];  
    
        $country = geoip_country_name_by_name($gi, $ip);    
    
        $error .= "User: <b>".$user."</b> Country: <b>".$country."</b> Ip: <b>".$ip."</b> <br /><br /> \n"; 
    
        //Bruk ip function og kanskje geoip isteden?
    
        echo "<p>Something went wrong. It has been logged and will be fixed shortly. Thanks </p>";  
        //echo $error; 
    
        log_error_ereg($error);
    
        }
    

    这正常工作,但是如果我得到一个严重的错误,它会显示出php文件名、出错的地方等我想对用户隐藏的东西。如何在错误处理程序中包含此类错误?似乎我的错误处理程序不接受…

    2 回复  |  直到 14 年前
        1
  •  1
  •   Adam Hopkinson    14 年前

    您的错误处理程序需要返回true-如果返回false,PHP默认错误处理程序将在完成后继续执行。

    另外,将显示错误设置为假:

    ini_set('display_errors', false);
    
        2
  •  2
  •   mellowsoon    14 年前

    从设置错误处理程序的PHP手册:

    以下错误类型 不能 使用用户定义的函数处理:e_错误、e_解析、e_核心_错误、e_核心_警告、e_编译_错误、e_编译_警告,以及在调用set_错误_handler()的文件中引发的大多数e_严格。