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

Восстановление обработчика ошибок restore_error_handler
Раздел: Обработка ошибок
restore_error_handler: bool
Описание функции restore_error_handler

Функция restore_error_handler() восстанавливает предыдущий обработчик ошибок после использования set_error_handler(). Она не принимает аргументов и всегда возвращает true.

Принцип работы

PHP поддерживает стек обработчиков ошибок. Когда вызывается set_error_handler(), новый обработчик помещается в стек. restore_error_handler() удаляет текущий обработчик, активируя предыдущий.

Сценарии использования
  • Временная замена обработчика ошибок в определенном блоке кода
  • Тестирование различных стратегий обработки ошибок
  • Создание модульной системы обработки ошибок
Базовые примеры использования
Восстановление стандартного обработчика

Код переключает обработчик и возвращает стандартный:

function customError($errno, $errstr) {
    echo "Перехвачена ошибка: $errstr";
}

$old_handler = set_error_handler("customError");
trigger_error("Тестовая ошибка");

restore_error_handler();
trigger_error("Эта ошибка обработана стандартным обработчиком");
Перехвачена ошибка: Тестовая ошибка
Notice: Эта ошибка обработана стандартным обработчиком in [...] on line 7
Цепочка обработчиков
function firstHandler($errno, $errstr) {
    echo "Первый обработчик: $errstr";
}

function secondHandler($errno, $errstr) {
    echo "Второй обработчик: $errstr";
    restore_error_handler();
}

set_error_handler("firstHandler");
set_error_handler("secondHandler");

trigger_error("Ошибка1");
trigger_error("Ошибка2");
Второй обработчик: Ошибка1
Первый обработчик: Ошибка2
Похожие функции в PHP
set_error_handler()

Устанавливает пользовательский обработчик ошибок. Принимает callback-функцию и опционально маску ошибок. Возвращает предыдущий обработчик или null.

set_exception_handler()

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

Устанавливает уровень отчетности об ошибках, но не изменяет обработчик.

Когда что использовать
  • restore_error_handler() — для возврата к предыдущему состоянию
  • set_error_handler() — для установки пользовательской логики обработки
  • error_reporting() — для фильтрации типов ошибок
Аналоги в других языках

Restore error handler в Javascript

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

let originalHandler = window.onerror;
window.onerror = function(msg, url, line) {
    console.log('Кастомная обработка:', msg);
};

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

Restore error handler в Python

В Python используется модуль sys и функция sys.excepthook:

import sys
original_hook = sys.excepthook

def custom_hook(type, value, traceback):
    print("Ошибка перехвачена")

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

Restore error handler в Java

В Java используются Thread.setDefaultUncaughtExceptionHandler(). Восстановление происходит путем сохранения предыдущего обработчика.

Типичные ошибки
Многократное восстановление

Вызов restore_error_handler() без предварительной установки кастомного обработчика приводит к восстановлению стандартного обработчика, но может вызвать путаницу:

restore_error_handler();
restore_error_handler();
// Оба вызова работают, но второй не имеет эффекта
Восстановление внутри обработчика

Восстановление внутри обработчика ошибок может привести к неожиданному поведению:

function customHandler($errno, $errstr) {
    echo "Обработка: $errstr";
    restore_error_handler();
}

set_error_handler("customHandler");
trigger_error("Ошибка1");
trigger_error("Ошибка2");
Обработка: Ошибка1
Notice: Ошибка2 in [...] on line 6
Потеря предыдущего обработчика

Если не сохранить возвращаемое set_error_handler() значение, предыдущий обработчик может быть потерян:

set_error_handler(function() { echo "Новый"; });
// Прямое восстановление без возможности вернуться к пользовательскому
restore_error_handler();
Изменения в версиях PHP
PHP 8.0.0

Функция restore_error_handler() теперь всегда возвращает true. В предыдущих версиях она могла возвращать false в случае ошибки.

PHP 7.0.0

Улучшена совместимость с механизмом исключений. Обработчики ошибок теперь корректно взаимодействуют с Throwable.

Исторические изменения

В PHP 5 функции set_error_handler() и restore_error_handler() стали более стабильными при работе с E_STRICT ошибками.

Расширенные примеры
Временная обработка в классе
Пример php
class ErrorManager {
    private static $previousHandler = null;
    
    public static function enableCustom() {
        self::$previousHandler = set_error_handler([self::class, 'handle']);
    }
    
    public static function disableCustom() {
        restore_error_handler();
    }
    
    public static function handle($code, $message, $file, $line) {
        echo "[Лог] $message в $file:$line";
    }
}

ErrorManager::enableCustom();
trigger_error("Ошибка в модуле A");
ErrorManager::disableCustom();
trigger_error("Ошибка в модуле B");
[Лог] Ошибка в модуле A в /path/to/file.php:17
Notice: Ошибка в модуле B in /path/to/file.php on line 18
Обработчик с контекстом
Пример php
function scopedErrorHandler($errno, $errstr, $errfile, $errline, $context) {
    if (isset($context['debug']) && $context['debug']) {
        echo "[Отладка] $errstr";
        restore_error_handler();
        return true;
    }
    return false;
}

$context = ['debug' => true];
set_error_handler('scopedErrorHandler', E_ALL, $context);
trigger_error("Тест");
// Обработчик автоматически восстанавливается при определенных условиях
[Отладка] Тест
Цепочка с восстановлением по уровню ошибки
Пример php
function handlerA($errno, $errstr) {
    echo "A: $errstr";
    if ($errno === E_WARNING) {
        restore_error_handler();
    }
}

function handlerB($errno, $errstr) {
    echo "B: $errstr";
}

set_error_handler("handlerA");
set_error_handler("handlerB");

trigger_error("E_NOTICE", E_USER_NOTICE);
trigger_error("E_WARNING", E_USER_WARNING);
trigger_error("E_NOTICE2", E_USER_NOTICE);
B: E_NOTICE
B: E_WARNING
A: E_NOTICE2

PHP restore_error_handler function comments

En
Restore error handler Restores the previous error handler function