PHP 8.5: Новые функции `get_exception_handler` и `get_error_handler`

В PHP 8.5 появились две важные функции для работы с обработчиками ошибок и исключений — `get_error_handler` и `get_exception_handler`. Эти нововведения решают проблему отсутствия прямого доступа к информации о текущих обработчиках, ранее требовавшая использования обходных решений.

PHP поддерживает определение пользовательских обработчиков ошибок и исключений, они вызываются в случае ошибки либо неперехваченного исключения. При необходимости можно восстановить предыдущие обработчики.

До PHP 8.5 не было прямого способа получения информации о текущих зарегистрированных обработчиках ошибок или исключений. Приходилось использовать хак: временно установить новый обработчик, после чего немедленно восстановить предыдущий:

$current_error_handler = set_error_handler('valid_callback');
restore_error_handler();

Этот обходной путь громоздкий и сопряжён с риском ошибок.

В PHP 8.5 добавлены две функции, предоставляющие эту функциональность.

function get_error_handler(): ?callable
function get_exception_handler(): ?callable

Эти функции возвращают текущие обработчики ошибок и исключений соответственно. Если обработчики отсутствуют, возвращается null.

Возвращаемый обработчик является точным значением обратного вызова, переданного в set_error_handler или set_exception_handler для его определения.

Ошибки и исключения

В PHP существуют два механизма обработки непредвиденных ситуаций:

Ключевые различия:

Понимание этих различий важно для эффективного использования новых функций получения обработчиков.

Установка обработчиков ошибок и исключений

Функции установки пользовательского обработчика принимают в качестве параметра вызываемый объект — функцию, вызываемую при возникновении ошибки или необработанного исключения.

set_error_handler('my_custom_error_handler_function');
set_exception_handler('my_custom_exception_handler_function');

При установке обработчиков функции set_*_handler возвращают существующие обработчики.

Функция get_error_handler

Функция get_error_handler, возвращающая текущий обработчик ошибок или null:

/**
* Возвращает текущий обработчик ошибок или null, если он не установлен.
* @return callable|null
*/

function get_error_handler(): ?callable {}

Функция get_exception_handler

Функция get_exception_handler возвращает текущий обработчик исключений и работает аналогично get_error_handler.

/**
* Возвращает текущий обработчик исключений или null, если он не установлен.
* @return callable|null
*/

function get_exception_handler(): ?callable {}

Пример использования

Механизм работы функций получения обработчика ошибок и обработчика исключений идентичен. В обоих случаях возвращается текущий обработчик или null.

set_error_handler(fn() => null);
get_error_handler(); // object(Closure)#1 (3) {...}

Полифилл

Поскольку функции set_error_handler и set_exception_handler возвращают предыдущий обработчик при установке нового, с их помощью легко реализовать полифилл:

/**
* Возвращает текущий обработчик ошибок или null, если он не установлен.
* @return callable|null
*/

function get_error_handler(): ?callable {
$handler = set_error_handler(null);
restore_error_handler();

return $handler;
}

/**
* Возвращает текущий обработчик исключений или null, если он не установлен.
* @return callable|null
*/

function get_exception_handler(): ?callable {
$handler = set_exception_handler(null);
restore_exception_handler();

return $handler;
}

Влияние на обратную совместимость

get_error_handler и get_exception_handler — новые функции, представленные в PHP 8.5. Если существующее PHP-приложение не объявляет идентичные имена функций в глобальном пространстве имён, это изменение не влияет на обратную совместимость.

Кроме того, можно реализовать полифилл для этих двух функций.

Комментарии


Дополнительные материалы

Предыдущая Статья

PHP 8.5: Поддержка трассировки стека для фатальных ошибок PHP