2012-05-24 148 views
0

大家好,一个可能很容易的问题。php自定义错误处理程序

我需要一个自定义错误处理程序来报告来自getJson调用的通知,并且不违反关于json格式响应的任何规则。

所以我想收集所有通知在会话变量,然后在响应

在我的错误处理程序的json_encode添加开关没有捕获任何选项

<?php 
session_start(); 

function myErrorHandler($errno, $errstr, $errfile, $errline) { 
if (!(error_reporting() & $errno)) { 
    // This error code is not included in error_reporting 
    return; 
} 

switch ($errno) { 
case E_USER_ERROR: 
    $error= "<b>My ERROR</b> [$errno] $errstr<br />\n"; 
    $error.= " Fatal error on line $errline in file $errfile"; 
    $error.= ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
    $error.= "Aborting...<br />\n"; 
    $_SESSION['Errors']['Errors'][]=$error; 
//exit(1); 
    break; 

case E_USER_WARNING: 
    $_SESSION['Errors']['Warning'][] = "<b>My WARNING</b> [$errno] $errstr<br />"; 
    break; 

case 8: // notice 
    if(isset($_REQUEST['ajax']) || isset($_REQUEST['ajaxAccess']))   { 
     $_SESSION['Errors']['Notice'][]="<b>My NOTICE</b> [$errno] $errstr $errfile $errline<br />"; 
     //json_encode($_SESSION); 
     } 

//  else $error.= "<b>My NOTICE</b> [$errno] $errstr $errfile $errline<br />\n"; 
    break; 

default: 
//  $error.= "Unknown error type: [$errno] $errstr<br />\n"; 
    break; 
} 

/* Don't execute PHP internal error handler */ 
return true; 
} 

$old_error_handler = set_error_handler("myErrorHandler"); 

问题$错误号是一个数字,并且与以下任何选项都不匹配

我可能必须更改配置中的某个字符串来使其起作用吗?

谢谢!

回答

1

您的代码只能处理由您触发的错误 - 由致电trigger error()造成的错误。为了捕获常规PHP函数和动作引发的错误,您还需要处理这些常量,最显着的是E_WARNINGE_NOTICE(您无法处理E_ERROR)。

您可以轻松地修改您switch以匹配以及:

function myErrorHandler($errno, $errstr, $errfile, $errline) { 

    if (!(error_reporting() & $errno)) { 
    // This error code is not included in error_reporting 
    return; 
    } 

    switch ($errno) { 
    case E_USER_ERROR: 
     $error= "<b>My ERROR</b> [$errno] $errstr<br />\n"; 
     $error.= " Fatal error on line $errline in file $errfile"; 
     $error.= ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
     $error.= "Aborting...<br />\n"; 
     $_SESSION['Errors']['Errors'][] = $error; 
     // exit(1); 
     break; 
    case E_WARNING: 
    case E_USER_WARNING: 
     $_SESSION['Errors']['Warning'][] = "<b>My WARNING</b> [$errno] $errstr<br />"; 
     break; 
    case E_NOTICE: 
    case E_USER_NOTICE: // notice 
     if(isset($_REQUEST['ajax']) || isset($_REQUEST['ajaxAccess']))   { 
     $_SESSION['Errors']['Notice'][] = "<b>My NOTICE</b> [$errno] $errstr $errfile $errline<br />"; 
     // json_encode($_SESSION); 
     } 
     // else $error.= "<b>My NOTICE</b> [$errno] $errstr $errfile $errline<br />\n"; 
     break; 
    default: 
     // $error.= "Unknown error type: [$errno] $errstr<br />\n"; 
     break; 
    } 

    /* Don't execute PHP internal error handler */ 
    return true; 

} 
+0

感谢您的答复。这意味着与_USER他们是由我触发,而不是他们是由我触发的PHP我想。我试着回去;) – giuseppe

相关问题