Restore exception handler: примеры (PHP)

Использование restore_exception_handler для управления обработкой исключений
Раздел: Обработка ошибок
restore_exception_handler: bool

Описание функции

Основные сведения

restore_exception_handler() — это встроенная функция PHP, которая восстанавливает предыдущий обработчик исключений. Она используется для возврата к предыдущему обработчику после установки нового с помощью set_exception_handler().

Когда применяется

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

Аргументы

Функция не принимает никаких параметров.

Возвращаемое значение: Функция всегда возвращает true.

Простые примеры

Базовое использование

Временная замена обработчика исключений:

<?php
// Стандартный обработчик
function default_handler($e) {
    echo "Стандартный обработчик: " . $e->getMessage();
}

// Кастомный обработчик
function custom_handler($e) {
    echo "Кастомный обработчик: " . $e->getMessage();
}

set_exception_handler('default_handler');
set_exception_handler('custom_handler');

// Восстановление предыдущего обработчика
restore_exception_handler();

// Теперь исключение обработается default_handler
throw new Exception("Тестовое исключение");
?>
Стандартный обработчик: Тестовое исключение

Альтернативы в PHP

set_exception_handler()

Устанавливает пользовательский обработчик исключений. Используется вместе с restore_exception_handler для временной замены обработчика.

set_error_handler() и restore_error_handler()

Аналогичный механизм для обработки ошибок (не исключений). restore_error_handler() восстанавливает предыдущий обработчик ошибок.

try-catch блок

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

Аналоги в других языках

Restore exception handler в Python

В Python используется sys.excepthook для глобальной обработки исключений:

import sys

def custom_exception_handler(exc_type, exc_value, exc_traceback):
    print(f"Кастомный обработчик: {exc_value}")

original_hook = sys.excepthook
sys.excepthook = custom_exception_handler

# Восстановление
sys.excepthook = original_hook

Restore exception handler в Javascript

В JavaScript для глобального перехвата исключений используется window.onerror или window.addEventListener('error', ...):

const originalHandler = window.onerror;
window.onerror = function(msg, url, line, col, error) {
    console.log('Кастомный обработчик:', msg);
    return false;
};

// Восстановление
window.onerror = originalHandler;

Restore exception handler в Java

В Java можно установить глобальный обработчик через Thread.setDefaultUncaughtExceptionHandler():

Thread.UncaughtExceptionHandler original = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler((thread, exception) -> {
    System.out.println("Кастомный обработчик: " + exception.getMessage());
});

// Восстановление
Thread.setDefaultUncaughtExceptionHandler(original);

Типичные ошибки

Восстановление несуществующего обработчика

Если вызвать restore_exception_handler() без предварительного установления пользовательского обработчика, функция восстановит встроенный обработчик PHP, что может быть неожиданным:

<?php
// Не установлен пользовательский обработчик
restore_exception_handler();
throw new Exception("Тест");
?>
Fatal error: Uncaught Exception: Тест in ...
Несоответствие сигнатуры обработчика

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

<?php
function old_handler($e, $code) { // Устаревшая сигнатура
    echo "Обработчик";
}

set_exception_handler('old_handler');
set_exception_handler(function($e) {});
restore_exception_handler(); // Восстанавливает old_handler

// При новом исключении будет ошибка
throw new Exception("Тест");
?>

Изменения в версиях PHP

PHP 7.0

Изменён тип передаваемого аргумента в обработчик исключений. Раньше передавался объект Exception, теперь — Throwable. Это влияет на обработчики, установленные до PHP 7.

PHP 8.0

Не было значительных изменений в работе restore_exception_handler(). Однако общая система обработки исключений стала строже в отношении типов.

Расширенные примеры

Цепочка обработчиков

Создание и восстановление нескольких уровней обработчиков:

Пример php
<?php
function handler1($e) {
    echo "Обработчик 1: " . $e->getMessage() . "\n";
}

function handler2($e) {
    echo "Обработчик 2: " . $e->getMessage() . "\n";
    restore_exception_handler(); // Возврат к handler1
    throw $e; // Повторно выбрасываем исключение
}

set_exception_handler('handler1');
set_exception_handler('handler2');

throw new Exception("Исключение 1");
?>
Обработчик 2: Исключение 1
Обработчик 1: Исключение 1
Временный обработчик в классе

Использование в объектно-ориентированном стиле:

Пример php
<?php
class ExceptionLogger {
    private $previousHandler;
    
    public function enable() {
        $this->previousHandler = set_exception_handler([$this, 'handle']);
    }
    
    public function disable() {
        restore_exception_handler();
    }
    
    public function handle($e) {
        // Логирование исключения
        error_log(date('Y-m-d H:i:s') . ': ' . $e->getMessage());
        // Вызов предыдущего обработчика
        if ($this->previousHandler) {
            call_user_func($this->previousHandler, $e);
        }
    }
}

$logger = new ExceptionLogger();
$logger->enable();
// ... код с логированием исключений
$logger->disable();
?>
Обработка с возвратом значения

Проверка успешности восстановления:

Пример php
<?php
$result = restore_exception_handler();
var_dump($result);
?>
bool(true)

PHP restore_exception_handler function comments

En
Restore exception handler Restores the previously defined exception handler function