2012-05-24 3 views
0

Привет всем, наверное, вопрос легко.php custom обработчик ошибок

Мне нужен пользовательский обработчик ошибок, чтобы сообщать об этом обратном из вызова 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"); 

Задача $ ERRNO является номером и не соответствует ни одному из вариантов ниже

Возможно, мне нужно что-то изменить в конфигурации, чтобы иметь такую ​​строку и заставить ее работать?

Спасибо!

ответ

1

Ваш код будет обрабатывать только ошибки, вызванные вами - ошибки, вызванные вызовом trigger error(). Чтобы уловить ошибки, вызванные регулярными функциями и действиями PHP, вам необходимо также обрабатывать эти константы, в частности E_WARNING и E_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

Смежные вопросы