Как мне захватить требуют ошибок + error_handlers

Я пытаюсь использовать 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.

0

Решение

Просто прочитайте документацию:

Требуется идентично, чтобы включить, кроме случаев отказа
вызвать фатальную ошибку уровня E_COMPILE_ERROR. Другими словами, это будет
остановить сценарий

(http://php.net/manual/en/function.require.php)

Это означает, что выполнение сценария прерывается при обнаружении этой ошибки. Ваш собственный обработчик ошибок будет использоваться, но throw будет игнорироваться, потому что это предполагает дальнейшее выполнение, которое на данный момент не разрешено.

1

Другие решения

Важно помнить, что в PHP есть два основных типа ошибок

  • Ошибки обработки обнаруживаются при запуске вашей программы
  • Ошибки компиляции возникают, когда у вас плохой синтаксис или когда вы пытаетесь сделать что-то невозможное

В твоем случае, require это ошибка компиляции Он не будет выполнять вашу пользовательскую функцию, потому что она никогда не зайдет так далеко. Компилятор не может включить плохой файл и потерпит неудачу.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector