Класс «Exceptions»

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. Но об этом в следующий раз.

You may also like...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Sign up
Lost your password? Please enter your username or email address. You will receive a link to create a new password via email.