2014-12-16 2 views
0

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

<?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.

ответ

1

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

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

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

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

0

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

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

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