2.1 Класс «Exceptions»

По | 14 июня, 2022
Exceptons

В данной статье я опишу класс обработки ошибок, который буду использовать в последующем. Использование данного класса позволяет зафиксировать большинство ошибок, которые могут возникнуть при работе CMS.

Итак создадим файл «Exceptions.php» в папке «site_address/includes/core/». В нём пропишем класс «Exceptions».

exception-1

Обозначим пространство имён «Wp\Core». Импортируем класс «ErrorException» с помощью оператора «use». В теле класса пропишем две переменные «$instance» и «$response». Первая переменная будет хранить ссылку на текущий класс (конструкция «Singleton» описана в статье Ядро WordPress. Введение. Класс «GlobalVariables»). Вторая переменная будет хранить ссылку на класс «Response», который будет создан позже.

В конструкторе класса, определим именную константу «LOGS». Она будет содержать путь к нашему log-файлу. Туда будут записываться ошибки, возникающие при работе CMS. Далее получаем ссылку на класс «Response». Этот класс будет формировать и отправлять ответ клиенту(браузеру). С помощью функции «ini_get()» проверяем значение директивы «log_errors» файла «php.ini». Данная директива отвечает за выбор журнала, в котором будут сохраняться сообщения об ошибках. Это может быть журнал сервера или самой CMS. Если данная директива отключена, то мы её включаем с помощью функции «ini_set()«.

Функция «error_reporting()» определяет какие ошибки будут зафиксированы и записаны. С полным списком возможных ошибок вы можете ознакомиться здесь. Следующим шагом задаётся пользовательский обработчик ошибок. Для этого используется функция «set_error_handler()». Этой функции в качестве параметра передаётся массив. В нём указана ссылка на текущий класс «Exceptions» и метод этого класса, который и будет обрабатывать возникающие ошибки.

exception-2

Теперь определим методы класса «Exceptions». Первым делом напишем метод «getInstance()». Аналогичный метод описывается в статье «Ядро WordPress. Введение. Класс «GlobalVaariables». Далее прописываем наш обработчик ошибок «err_handler()». В качестве параметра, данная функция получает тип ошибки. Так как функции «error_reporting()» не было передано никаких параметров, то она вернет текущее значение уровня протоколирования ошибок.

Далее, в зависимости, от типа ошибки указывается заголовок сообщения «$type». Напоминаю, что символ «@» — это оператор управления ошибками. После запускается ещё один метод класса «exc_handler()».

exception-4

Метод «exc_handler()» принимает, в качестве параметра, тип возникшей ошибки. Первым делом вызывается функция «debug_backtrace()». Эта функция возвращает массив вложенных ассоциативных массивов. Данные этого массива позволяют определить место, где возникла ошибка и сообщить об этом разработчику.

exception-5

В зависимости от значения именной константы «WP_DEBUG» сообщение выводится на экран монитора или записывается в log-файл. Само сообщение хранится в двух переменных. Содержимое переменной «$error» выводится на экран монитора с помощью функции «exit()», которая прекращает работу скрипта. Содержимое переменной «$logs» записывается в log-файл при помощи функции «error_log()».

Теперь осталось реализовать последний метод «show()». Данному методу, в качестве параметров, передаются:

  • Само сообщение, которое обрабатывается функцией «htmlentities()». Эта функция преобразует все возможные символы в соответствующие HTML-сущности. Например: $str = "A 'quote' is <b>bold</b>"; // выводит: A 'quote' is <b>bold</b> echo htmlentities($str); // выводит: A 'quote' is <b>bold</b> echo htmlentities($str, ENT_QUOTES); Использование данной функции является одним из способов защиты от XSS атаки.
  • Тип ошибки.
  • Заголовки, передаваемые браузеру при выводе сообщения.

Данный метод вызывает функцию «trigger_error()». Она вызывает пользовательскую ошибку/предупреждение/уведомление и используется в связке с нашим обработчиком ошибок. Метод «show()» использует к тому же класс «Response». Этот класс формирует заголовки, которые будут отправлены сервером при выводе ошибки на экран монитора.

Перед выводом сообщения очищаются все установленные ранее заголовки, если такие были, с помощью метода «clearHeaders()» класса «Response». Это необходимо для того, чтобы избежать некоторых ошибок, при выводе интересующей нас ошибки (и такое бывает). Затем мы устанавливаем свои заголовки, если они есть, с помощью метода «setHeaders()» класса «Response».

Класс «Exceptions» готов. Теперь нам необходимо создать класс автозагрузки, который будет подключать все файлы, необходимые для работы нашей CMS. Но об этом в следующий раз.