Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Laravel: exceptions, laravel, middleware

Где и как обрабатываются глобальные исключения?

Этот вопрос проверяет понимание механизмов централизованной обработки ошибок и исключений в PHP-приложениях, особенно в контексте фреймворков.

Короткий ответ

Глобальные исключения обрабатываются с помощью механизма перехвата необработанных исключений на уровне приложения. В чистом PHP для этого используется функция set_exception_handler(). В современных фреймворках (Laravel, Symfony) это встроенный функционал. В Laravel, например, вся обработка исключений делегируется классу App\Exceptions\Handler, где можно описать логику для разных типов исключений: логирование, преобразование в JSON-ответ для API или показ пользовательской страницы ошибки.

Длинный ответ

Централизованная обработка исключений — ключевой аспект создания стабильного и отказоустойчивого приложения.

Уровни обработки исключений

  1. Уровень приложения / фреймворка

    • Laravel: Все исключения проходят через класс App\Exceptions\Handler (реализующий интерфейс Illuminate\Contracts\Debug\ExceptionHandler).

    • Методы обработчика:

      • report(): Для логирования исключения (отправка в Slack, Sentry, Logstash).

      • render(): Для преобразования исключения в HTTP-ответ, который будет показан пользователю.

  2. Уровень веб-сервера (Nginx/Apache)

    • Если исключение вообще не было перехвачено PHP-кодом (фатальная ошибка), в игру вступает веб-сервер. Он покажет стандартную страницу ошибки (например, "500 Internal Server Error").

    • В продакшене настраивают кастомные страницы ошибок, чтобы не показывать пользователям технические детали.

Как это работает на практике (Laravel пример)

// app/Exceptions/Handler.php

public function report(Exception $exception)
{
    // Отправляем все исключения уровня CRITICAL в Sentry
    if ($exception instanceof CriticalException) {
        app('sentry')->captureException($exception);
    }

    parent::report($exception);
}

public function render($request, Exception $exception)
{
    // Для API-запросов всегда возвращаем JSON
    if ($request->expectsJson()) {
        return response()->json([
            'error' => 'Произошла ошибка сервера'
        ], 500);
    }

    // Показываем кастомную страницу для 404 ошибки
    if ($exception instanceof NotFoundHttpException) {
        return response()->view('errors.404', [], 404);
    }

    return parent::render($request, $exception);
}

Глобальный перехватчик в чистом PHP

set_exception_handler(function (Throwable $exception) {
    // Логируем исключение
    error_log($exception->getMessage());

    // Показываем пользователю дружелюбное сообщение
    http_response_code(500);
    echo "Что-то пошло не так. Мы уже работаем над этим.";
});

Вывод:
Глобальная обработка исключений позволяет централизованно управлять всеми непредвиденными ошибками в приложении. Это обеспечивает:

  • Безопасность: Пользователи не видят стектрейсы и чувствительные данные.

  • Удобство: Пользователи получают понятные сообщения об ошибках.

  • Наблюдаемость: Разработчики получают уведомления о всех ошибках через логи и системы мониторинга.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Laravel

    Laravel

Ключевые слова

#exceptions

#laravel

#middleware

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.