Постараюсь ответить на свой вопрос. @apokryfos прав: в руководстве есть подробности об этом. Меня немного сбивает с толку то, что set_exception_handler
захватывает не только объекты Exception
и Throwable
, но также объекты Error
(которые являются объектами Throwable
, но не объектами Exception
).
Меня это сбивает с толку, потому что в set_error_handler
есть слово «ошибка», но он не улавливает эти типы объектов.
Итак, для всех, кто наткнется на это, в новых версиях PHP, вы не можете ожидать объект Exception
для обратного вызова set_exception_handler
. Вам нужно ожидать Throwable
, и нелинейно вы также можете получить Error
объектов, которые не получены set_error_handler
.
Чтобы справиться с этим в моем собственная настройка, у меня есть следующее set_error_handler
, чтобы сделать вещи немного чище:
set_error_handler(function($errno, $errstr, $errfile, $errline, $errcontext) {
$args = array($errstr, $errno, E_ERROR, $errfile, $errline);
$errorException = new \ErrorException(... $args);
});
Это затем будет перехвачено вашим обратным вызовом set_exception_handler
. Надеюсь, это поможет другим :)