Обзор класса ErrorHandler в PHP
Класс ErrorHandler в PHP предназначен для обработки различных типов ошибок и исключений в приложении, что позволяет улучшить управление ошибками и предоставляет пользователю более понятные сообщения об ошибках. В этой статье мы подробно рассмотрим каждую часть этого класса, его методы и роль в приложении.
1. Конструктор класса
public function __construct()
{
if (DEBUG) {
error_reporting(-1); // Эффективное отображение всех ошибок в режиме отладки
} else {
error_reporting(0); // Скрываем ошибки в продуктивном режиме
}
set_exception_handler([$this, 'exceptionHandler']); // Устанавливаем обработчик исключений
set_error_handler([$this, 'errorHandler']); // Устанавливаем обработчик ошибок
ob_start(); // Начинаем буферизацию вывода
register_shutdown_function([$this, 'fatalErrorHandler']); // Регистрируем обработчик фатальных ошибок
}
В конструкторе класса устанавливаются необходимые обработчики для различных типов ошибок:
set_exception_handler: обрабатывает необработанные исключения.set_error_handler: обрабатывает ошибки, которые происходят в процессе выполнения.register_shutdown_function: обрабатывает фатальные ошибки при завершении скрипта.
2. Обработка ошибок
Метод errorHandler
public function errorHandler($errno, $errstr, $errfile, $errline)
{
$this->logError($errstr, $errfile, $errline); // Логируем ошибку
$this->displayError($errno, $errstr, $errfile, $errline); // Отображаем ошибку
}
Этот метод срабатывает на ошибки, которые были обработаны. Он записывает ошибку в лог и вызывает метод displayError для отображения ошибки пользователю.
Метод fatalErrorHandler
public function fatalErrorHandler()
{
$error = error_get_last(); // Получаем информацию о последней ошибке
if (!empty($error) && $error['type'] & (E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR)) {
$this->logError($error['message'], $error['file'], $error['line']); // Логируем фатальную ошибку
ob_end_clean(); // Очищаем буфер вывода
$this->displayError($error['type'], $error['message'], $error['file'], $error['line']); // Отображаем ошибку
} else {
ob_end_flush(); // Завершаем буферизацию, если ошибок нет
}
}
Этот метод обрабатывает фатальные ошибки, которые происходят во время выполнения приложения. Он также записывает ошибку в лог, если таковая есть, и очищает вывод перед ее отображением.
3. Обработка исключений
Метод exceptionHandler
public function exceptionHandler(\Throwable $e)
{
$this->logError($e->getMessage(), $e->getFile(), $e->getLine()); // Логируем информацию об исключении
$this->displayError('Исключение', $e->getMessage(), $e->getFile(), $e->getLine(), $e->getCode()); // Отображаем сообщение об ошибке
}
Этот метод обрабатывает все необработанные исключения. Он логирует сообщение об исключении и отображает пользовательское сообщение об ошибке.
4. Логирование
Метод logError
protected function logError($message = '', $file = '', $line = '')
{
file_put_contents(LOGS .'/errors.log', "[". date('Y-m-d H:i:s') . "] Текст ошибки: {$message} | Файл: {$file} | Строка: {$line}\n=================\n", FILE_APPEND);
}
Этот метод записывает информацию об ошибках в файл логов. Запись включает временную метку, текст ошибки, файл и строку, где произошла ошибка.
5. Обработка reCAPTCHA
Метод handleCaptchaResponse
public function handleCaptchaResponse($Return, $successMessage = 'Спасибо! Вы подписались на нашу рассылку.', $errorMessage = 'При отправке формы произошла ошибка. Пожалуйста, попробуйте ещё раз позже', $infoMessage = 'You are Robot - Robots are not welcome here!')
{
if (!isset($Return->success)) {
$this->logError('Не удалось получить корректный ответ от reCAPTCHA: '. print_r($Return, true), __FILE__, __LINE__);
$_SESSION['response']['error'] = '
'. $errorMessage .''; } elseif ($Return->success === FALSE) { $_SESSION['response']['already_have'] = $infoMessage; } elseif (property_exists($Return, 'score') && $Return->score < 0.5) { $_SESSION['response']['already_have'] = $infoMessage; } else { $_SESSION['response']['success'] = $successMessage; } }Этот метод обрабатывает ответ от reCAPTCHA. Он логирует ошибки при неверном ответе и устанавливает соответствующие сообщения для сессии, в зависимости от результата проверки.
6. Отображение ошибок
Метод displayError
public function displayError($errno, $errstr, $errfile, $errline, $responce = 500) { if ($responce == 0) { $responce = 404; } http_response_code($responce); // Устанавливаем код ответа HTTP if ($responce == 404 && !DEBUG) { require WWW .'/errors/404.php'; // Отображаем 404 страницу die(); } if (DEBUG) { require WWW .'/errors/development.php'; // Отображаем подробную ошибку в режиме отладки } else { require WWW .'/errors/production.php'; // Отображаем общую ошибку в продуктивном режиме } die(); }Этот метод отвечает за отображение ошибок пользователю. В зависимости от установленного режима (отладка или продакшен) он загружает соответствующий файл для отображения ошибки.
Пример вызова класса
$Return = getCaptcha($_POST['g-recaptcha-response']); /* We make a request to google service and record the response */ // Если проверка reCAPTCHA не прошла, используем ErrorHandler $handler = new ErrorHandler(); // Создаем новый объект ErrorHandler $handler->handleCaptchaResponse($Return); // Вызываем метод для обработки ответа от reCAPTCHAВ этом коде создается экземпляр класса
ErrorHandler, который затем используется для обработки ответа от reCAPTCHA. Если проверка не прошла, класс логирует ошибку и устанавливает соответствующее сообщение для пользователя.Упс! Ошибка 404 – Страница отсутствует
Если вам будет интересно узнать, как я реализовал обработку ошибки 404 — "Страница не найдена", с сообщением "Упс! Ошибка 404 – Страница отсутствует", Мы извлекаем данные из БД для дальнейшей обработки. Пишите в комментариях! Я с удовольствием расскажу и покажу все детали реализации. Ведь правильная обработка ошибок — это важный аспект разработки, который помогает улучшить пользовательский опыт и делает ваше приложение более надежным. Не стесняйтесь задавать вопросы, и я постараюсь ответить на все ваши запросы!

Заключение
Класс
ErrorHandlerпредоставляет эффективный способ управления ошибками в PHP-приложении. Он позволяет логировать ошибки, обрабатывать исключения и отображать сообщения пользователю в зависимости от режима работы приложения. Применение такого класса значительно повышает качество кода и удобство отладки.
Добавить комментарий или задать вопрос ツ
Комментариев нет