Restore error handler: примеры (PHP)
restore_error_handler: boolФункция 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
Устанавливает пользовательский обработчик ошибок. Принимает callback-функцию и опционально маску ошибок. Возвращает предыдущий обработчик или null.
Определяет пользовательский обработчик исключений. Работает аналогично, но для исключений.
Устанавливает уровень отчетности об ошибках, но не изменяет обработчик.
- 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_hookRestore 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();Функция restore_error_handler() теперь всегда возвращает true. В предыдущих версиях она могла возвращать false в случае ошибки.
Улучшена совместимость с механизмом исключений. Обработчики ошибок теперь корректно взаимодействуют с Throwable.
В PHP 5 функции set_error_handler() и restore_error_handler() стали более стабильными при работе с E_STRICT ошибками.
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
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("Тест");
// Обработчик автоматически восстанавливается при определенных условиях[Отладка] Тест
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