Файл ErrorHandler.php в Cotonti
назначение класса ErrorHandler в файле ErrorHandler.php заключается в обработке исключений и ошибок, возникающих в приложении, и в управлении тем, как эти ошибки отображаются пользователю.
Основное назначение класса ErrorHandler в файле ErrorHandler.php заключается в обработке исключений и ошибок, возникающих в приложении, и в управлении тем, как эти ошибки отображаются пользователю. Класс централизованно решает, нужно ли логировать исключения, блокировать доступ при определённых ошибках (например, при ForbiddenHttpException), а также решает, какие сообщения об ошибках следует выводить в зависимости от настроек конфигурации и группы пользователя.
Суть содержания кода:
-
Обработка исключений: Класс обрабатывает различные типы исключений, такие как
ForbiddenHttpException,NotFoundHttpException,BadRequestHttpException, иHttpException. Он проверяет тип исключения и в зависимости от этого решает, нужно ли его логировать, блокировать ли доступ или показывать подробное сообщение об ошибке. -
Логирование исключений: Если исключение не относится к критическим (например, 403, 404 или 400 ошибки), оно логируется в системный журнал с помощью функции
error_log(). -
Отображение сообщений об ошибке: Для
HttpExceptionи других ошибок, отображение сообщений пользователю зависит от конфигурации (если разрешено показывать ошибки) и группы пользователя. Для администраторов (например, супер-администраторов) показываются подробные сообщения об ошибках, включая трассировку стека. -
Завершение работы приложения: В случае ошибки выполнение скрипта завершается с помощью функции
cot_die_message(), которая выводит сообщение и завершает выполнение.
Характеристика стиля PHP:
-
Объектно-ориентированное программирование (ООП): В коде используется объектно-ориентированный стиль программирования, где создается класс
ErrorHandlerс методами для обработки исключений и отображения ошибок. В классе применяется наследование и использование трейтов (например,GetInstanceTrait). -
Использование строгой типизации: Включена строгая типизация с помощью директивы
declare(strict_types=1), что требует точного соответствия типов данных. -
Использование пространства имен (namespace): Применяется пространство имен
cot, что помогает организовать код и избегать конфликтов имен. -
Обработка исключений с использованием интерфейса
Throwable: Весь код ориентирован на работу с исключениями и ошибками через интерфейсThrowable, что позволяет обработать как ошибки, так и исключения в единой структуре. -
Глобальные переменные: В некоторых местах кода используются глобальные переменные
$cfgи$usr, что может быть недостатком с точки зрения чистоты кода, но это обычная практика в некоторых системах, чтобы избежать передачи этих значений через множество функций. -
Читаемость и комментарии: Код достаточно читаемый, с четкими именами переменных и методов, которые ясно отражают их назначение. В комментариях поясняется логика работы функций и их применения.
В целом, стиль кода можно охарактеризовать как современный и объектно-ориентированный, с акцентом на чистоту и четкость обработки ошибок, при этом с использованием глобальных переменных для работы с конфигурацией и пользователями.
declare(strict_types=1); // Включает строгую типизацию, что означает, что типы переменных должны строго соответствовать объявленным типам
namespace cot; // Определение пространства имен "cot" для всех классов и функций, относящихся к этому проекту
use cot\exceptions\BadRequestHttpException; // Подключение класса исключения для ошибок типа "Неверный запрос" (HTTP 400)
use cot\exceptions\ForbiddenHttpException; // Подключение класса исключения для ошибок типа "Запрещено" (HTTP 403)
use cot\exceptions\HttpException; // Подключение базового класса исключений для HTTP ошибок
use cot\exceptions\NotFoundHttpException; // Подключение класса исключения для ошибок типа "Не найдено" (HTTP 404)
use cot\traits\GetInstanceTrait; // Подключение трейта для реализации паттерна "Одиночка" (Singleton)
use Throwable; // Подключение интерфейса Throwable для работы с исключениями и ошибками
defined('COT_CODE') or die('Wrong URL'); // Проверка, что константа COT_CODE определена. Если нет, выполнение скрипта остановится с ошибкой "Неверный URL"
// Определение класса ErrorHandler для обработки ошибок в системе
class ErrorHandler
{
use GetInstanceTrait; // Использование трейта GetInstanceTrait для предоставления метода получения экземпляра класса (Одиночка)
// Метод обработки исключений
public function handle(Throwable $exception): bool
{
// В этом блоке класса cot еще может не быть инициализирован, поэтому используется глобальные переменные
global $cfg, $usr;
$logException = true; // Переменная для определения, нужно ли логировать исключение
// Проверка типа исключения. Если это ошибки 403, 404 или 400, то исключение не будет логироваться.
if (
$exception instanceof ForbiddenHttpException // Если исключение типа "ForbiddenHttpException"
|| $exception instanceof NotFoundHttpException // Или исключение типа "NotFoundHttpException"
|| $exception instanceof BadRequestHttpException // Или исключение типа "BadRequestHttpException"
) {
$logException = false; // Исключение не логируется
}
// Если нужно логировать исключение
if ($logException) {
error_log((string) $exception); // Логирование исключения в системный журнал
}
// Если исключение типа ForbiddenHttpException, блокируем доступ
if ($exception instanceof ForbiddenHttpException) {
cot_block(false); // Блокировка доступа пользователю
}
// Если исключение типа HttpException
if ($exception instanceof HttpException) {
// Проверка, нужно ли отображать ошибки в зависимости от конфигурации и группы пользователя
$displayErrors = $cfg['display_errors'] || in_array(COT_GROUP_SUPERADMINS, $usr['groups']);
// Завершаем выполнение скрипта с сообщением об ошибке
cot_die_message(
$exception->getCode(), // Код ошибки, полученный из исключения
true, // Указывает, что сообщение будет выводиться
'', // Пустое сообщение (можно добавить дополнительные данные, если нужно)
$displayErrors ? $exception->getMessage() : '' // Сообщение исключения, если отображение ошибок разрешено
);
}
$this->displayError($exception); // Вызов метода для отображения ошибки
return true; // Возвращаем true, подтверждая обработку исключения
}
/**
* Отображает исключение пользователю и завершает выполнение скрипта
*/
public function displayError(Throwable $exception): void
{
// В этом блоке класса cot еще может не быть инициализирован, поэтому используются глобальные переменные
global $cfg, $usr;
// Проверка, нужно ли отображать ошибки в зависимости от конфигурации и группы пользователя
$displayErrors = $cfg['display_errors'] || in_array(COT_GROUP_SUPERADMINS, $usr['groups']);
// Если ошибки нужно отображать
if ($displayErrors) {
// Получение основного названия сайта или URL
$mainTitle = $cfg['maintitle'] ?? $cfg['mainurl']; // Если название сайта не задано, используем URL сайта
$message_body = '<p><em>' . @date('Y-m-d H:i') . '</em></p>'; // Формируем строку с текущей датой и временем
// Формирование сообщения с деталями исключения (сообщение, файл и строка)
$message_body .= '<p>' . $exception->getMessage() . ' in ' . $exception->getFile() . ':'
. $exception->getLine() . '</p>';
$message_body .= '<pre style="overflow: auto">' . $exception->getTraceAsString() . '</pre>'; // Вывод трассировки стека
$message_body .= '<hr /><a href="' . $cfg['mainurl'] . '">' . $mainTitle . '</a>'; // Ссылка на главную страницу
// Завершаем выполнение скрипта с деталями ошибки
cot_die_message(500, true, '', $message_body);
} else {
// Если ошибки не нужно отображать, выводим сообщение о технических проблемах
cot_die_message(503, true);
}
}
}
Разбор:
- В классе используется строгая типизация, что означает, что все параметры и возвращаемые значения функций строго проверяются на соответствие типам.
- Основное назначение класса ErrorHandler — это обработка ошибок и исключений в приложении.
- В классе реализованы два метода:
handle()— Обрабатывает исключения, проверяя их типы и принимая решение о логировании и отображении ошибок.displayError()— Отображает информацию о возникшей ошибке пользователю в зависимости от конфигурации отображения ошибок.
Это помогает централизованно управлять обработкой ошибок и исключений, а также контролировать отображение и логирование ошибок в зависимости от настроек и группы пользователя.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 26.01.2025 13:10
- Последнее обновление: 26.01.2025 13:10