Это мое понимание, согласно http://php.net/manual/en/language.errors.php7.php, что ошибки в PHP7 теперь должны быть выброшены. Но в моем собственном тестировании это не так:
<?php
error_reporting(E_ALL);
try {
echo $a[4];
} catch (Throwable $e) {
echo "caught\n";
}
echo "all done!\n";
В этом случае я ожидаю, что «схвачено» будет echo’d, а затем сценарий скажет «все готово!». Вместо этого я получаю это:
Notice: Undefined variable: a in C:\games\test-ssh3.php on line 12
all done!
Я что-то неправильно понимаю?
Исключения генерируются только для определенных типов ошибок, которые ранее останавливали выполнение (E_RECOVERABLE_ERROR
). Предупреждения и уведомления не останавливают выполнение, поэтому исключение не выдается (найдено источник за это).
Вы должны определить пользовательский обработчик ошибок и брось туда исключение. Уведомления PHP не являются исключениями, поэтому они не перехватываются try/catch
блок.
set_error_handler('custom_error_handler');
function custom_error_handler($severity, $message, $filename, $lineno) {
throw new ErrorException($message, 0, $severity, $filename, $lineno);
}
try {
echo $a[4];
} catch (ErrorException $e) {
echo $e->getMessage().PHP_EOL;
}
echo "all done!\n";
Других решений пока нет …