2009-12-27 3 views
3

Когда начинается мой сценарий, у меня есть:Почему мой обработчик ошибок не вызван?

error_reporting(E_ALL); 
ini_set('display_errors', TRUE); 
ini_set('display_startup_errors', TRUE); 

И потом, я зарегистрировать свой собственный обработчик ошибок с PHP:

function handleError($code, $text, $file, $line) { 
    echo "&%!!"; 
    return true; 
} 

set_error_handler('handleError'); 

Далее наступает некоторый код, который выдает ошибку, как это:

Fatal error: Call to undefined method DB::getInstanceForDB() in /Applications/MAMP/htdocs/mysite/classes/Test.php on line 32

Я продолжаю получать стандартное окно с сообщением об ошибке PHP с стеком вызовов и всем на моем сайте, независимо от того, задаю ли я специальный обработчик ошибок или нет. Любая идея, что не так?

Редактировать: Независимо от того, верну я true или нет, он не вызывает мой пользовательский обработчик.

ответ

5

Во-первых, вам нужно вернуть функцию обработки ошибок true. От set_error_handler:

If the function returns FALSE then the normal error handler continues.

Во-вторых, следует помнить, что фатальные ошибки не обрабатываются set_error_handler. Вы также должны использовать register_shutdown_function. Таким образом, ваш код должен выглядеть так:

// Handles non-fatal errors 
function handleError($code, $text, $file, $line) { 
    var_dump($code); 
    return true; 
} 
set_error_handler('handleError'); 

// Handles fatal errors 
function fatalShutdown() { 
    var_dump(error_get_last()); 
} 
register_shutdown_function('fatalShutdown'); 
+0

видеть обновления о фатальных ошибках. – philfreo

0

В вашем вопросе вы сообщаете, что получаете фатальную ошибку.

Я не думаю, что вы можете поймать их, так как они ... хорошо ... Фатально.

Цитирование set_error_handler:

The following error types cannot be handled with a user defined function: E_ERROR , E_PARSE , E_CORE_ERROR , E_CORE_WARNING , E_COMPILE_ERROR , E_COMPILE_WARNING , and most of E_STRICT raised in the file where set_error_handler() is called.

3

Принятый ответ неверен, потому что завершающая функция вызывается всеми остановками, в том числе и обрабатываются в другом месте, или просто, когда страница заканчивается успешно.

Я закончил с этим, в дополнение к использованию set_exception_handler и set_error_handler:

// from http://www.php.net/manual/en/function.set-error-handler.php 
define('FATAL', E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING); 

register_shutdown_function('shutdown'); 

// Handles "fatal" errors e.g. Syntax errors 
function shutdown() { 
    // Only if there was an fatal error, this is run on all execution endpoints 
    $error_info = error_get_last(); 
    if ($error_info !== null && ($error_info['type'] & FATAL)) { 
     # stack trace set to empty array, as generating one here is useless 
     [[ do stuff like emailing someone]] 
    } 
} 
Смежные вопросы