Преобразование ошибок в исключения

PHP 06.08.21 07.08.21 292
Бесплатные курсына главную сниппетов

Мы приходим к выводу, что ошибку любого уровня можно трактовать как "серьезную" (за исключением ситуации, когда перед выражением явно указан оператор @, подавляющий вывод всех ошибок). Для обработки же серьезных ошибок в PHP имеется прекрасное средство — исключения.

Решение, которое мы здесь рассмотрим, — библиотека для автоматического преобразования всех перехватываемых ошибок PHP (вроде E_WARNING, E_NOTICE и т. д.) в объекты-исключения одноименных классов. Таким образом, если программа не сможет, например, открыть какой-то файл, теперь будет сгенерировано исключение, которое можно перехватить в соответствующем участке программы.

## Преобразование ошибок в исключения require_once "PHP/Exceptionizer.php"; // Для большей наглядности поместим основной проверочный код в функцию suffer(); // Убеждаемся, что перехват действительно был отключен echo "<b>Дальше должно идти обычное сообщение PHP.</b>"; fopen("fork", "r"); function suffer() { // Создаем новый объект-преобразователь. Начиная с этого момента // и до уничтожения переменной $w2e все перехватываемые ошибки // превращаются в одноименные исключения. $w2e = new PHP_Exceptionizer(E_ALL); 532 Часть IV. Основы объектно-ориентированного программирования try { // Открываем несуществующий файл. Здесь будет ошибка E_WARNING. fopen("spoon", "r"); } catch (E_WARNING $e) { // Перехватываем исключение класса E_WARNING echo "<pre><b>Перехвачена ошибка!</b>\n", $e, "</pre>"; } // В конце можно явно удалить преобразователь командой: // unset($w2e); // Но можно этого и не делать - переменная и так удалится при // выходе из функции (при этом вызовется деструктор объекта $w2e, // отключающий слежение за ошибками). }

Обратите внимание на заголовок catch-блока. Он может поначалу ввести в заблуждение: ведь перехватывать можно только объекты-исключения, указывая имя класса, но никак не числовое значение (E_WARNING — вообще говоря, константа PHP, числовое значение которой равно 2 — можете убедиться в этом, запустив оператор echo E_WARNING). Тем не менее ошибки нет: E_WARNING — это одновременно и имя класса, определяемого в библиотеке PHP_Exceptionizer.

Заметьте также, что для ограничения области работы перехватчика используется уже знакомая нам идеология: "выделение ресурса есть инициализация". А именно в том месте, с которого необходимо начать преобразование, мы помещаем оператор создания нового объекта PHP_Exceptionizer и запоминаем последний в переменной, а там, где преобразование следует закончить, просто уничтожаем объект-перехватчик (явно или, как в примере, неявно, при выходе из функции).

--> Класс для преобразования ошибок PHP в исключения: https://github.com/DmitryKoterov/php_exceptionizer/blob/master/lib/PHP/Exceptionizer.php

 

на главную сниппетов
Курсы