Обзор класса ErrorHandler в PHP

Andre Kowalsy
77 раз
5 мин чтения
Опубликовано: 08-11-2025
Обновлено: Не обновлялось
Категории: Разработка

Класс 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 – Страница отсутствует", Мы извлекаем данные из БД для дальнейшей обработки. Пишите в комментариях! Я с удовольствием расскажу и покажу все детали реализации. Ведь правильная обработка ошибок — это важный аспект разработки, который помогает улучшить пользовательский опыт и делает ваше приложение более надежным. Не стесняйтесь задавать вопросы, и я постараюсь ответить на все ваши запросы!

    Oops! 404

    Заключение

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