Этот вопрос проверяет понимание механизмов централизованной обработки ошибок и исключений в PHP-приложениях, особенно в контексте фреймворков.
Глобальные исключения обрабатываются с помощью механизма перехвата необработанных исключений на уровне приложения. В чистом PHP для этого используется функция set_exception_handler(). В современных фреймворках (Laravel, Symfony) это встроенный функционал. В Laravel, например, вся обработка исключений делегируется классу App\Exceptions\Handler, где можно описать логику для разных типов исключений: логирование, преобразование в JSON-ответ для API или показ пользовательской страницы ошибки.
Централизованная обработка исключений — ключевой аспект создания стабильного и отказоустойчивого приложения.
Уровень приложения / фреймворка
Laravel: Все исключения проходят через класс App\Exceptions\Handler (реализующий интерфейс Illuminate\Contracts\Debug\ExceptionHandler).
Методы обработчика:
report(): Для логирования исключения (отправка в Slack, Sentry, Logstash).
render(): Для преобразования исключения в HTTP-ответ, который будет показан пользователю.
Уровень веб-сервера (Nginx/Apache)
Если исключение вообще не было перехвачено PHP-кодом (фатальная ошибка), в игру вступает веб-сервер. Он покажет стандартную страницу ошибки (например, "500 Internal Server Error").
В продакшене настраивают кастомные страницы ошибок, чтобы не показывать пользователям технические детали.
// 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);
}set_exception_handler(function (Throwable $exception) {
// Логируем исключение
error_log($exception->getMessage());
// Показываем пользователю дружелюбное сообщение
http_response_code(500);
echo "Что-то пошло не так. Мы уже работаем над этим.";
});Вывод:
Глобальная обработка исключений позволяет централизованно управлять всеми непредвиденными ошибками в приложении. Это обеспечивает:
Безопасность: Пользователи не видят стектрейсы и чувствительные данные.
Удобство: Пользователи получают понятные сообщения об ошибках.
Наблюдаемость: Разработчики получают уведомления о всех ошибках через логи и системы мониторинга.