Я пытаюсь использовать set_error_handler
функция для захвата require
ошибки.
пока мой обычай error_handler
используется, контекст кажется полностью выключенным, хотя трассировка верна.
<?php
function error_handler($errno, $errstr, $errfile, $errline){
throw new Exception($errstr);
}
set_error_handler('error_handler');try{
trigger_error("somethign",E_USER_NOTICE);
}catch(Exception $e){
echo "I got caught";
}try{
require "something/that/does/not/exists.php";
}catch(Exception $e){
echo "I got caught";
}
Как видно, когда я запускаю первую ошибку, она вызывает error_handler
который в свою очередь бросает исключение. Который пойман в первой попытке поймать.
Во второй раз, когда я пытаюсь включить несуществующий файл, снова error_handler
используется, но исключение не ловится.
Что здесь происходит?
Я использую PHP 5.5. *
Протестировано в режиме CLI.
Просто прочитайте документацию:
Требуется идентично, чтобы включить, кроме случаев отказа
вызвать фатальную ошибку уровня E_COMPILE_ERROR. Другими словами, это будет
остановить сценарий
(http://php.net/manual/en/function.require.php)
Это означает, что выполнение сценария прерывается при обнаружении этой ошибки. Ваш собственный обработчик ошибок будет использоваться, но throw
будет игнорироваться, потому что это предполагает дальнейшее выполнение, которое на данный момент не разрешено.
Важно помнить, что в PHP есть два основных типа ошибок
В твоем случае, require
это ошибка компиляции Он не будет выполнять вашу пользовательскую функцию, потому что она никогда не зайдет так далеко. Компилятор не может включить плохой файл и потерпит неудачу.