В некоторых маршрутах для нашего проекта Api-Platform исключения составляют throw
n для некоторых распространенных ошибок.
Например, при вызове POST /orders
, NewOrderHandler
может выбросить любой из этих двух, если это необходимо :
NotEnoughStock
NotEnoughCredit
Все эти исключения относятся к иерархии DomainException
.
Эти исключения правильно преобразованы в код состояния 400
в ответе с использованием конфигурации exception_to_status
, и ответ содержит соответствующее сообщение об ошибке. Пока все хорошо.
exception_to_status:
App\Order\NotEnoughStock: !php/const Symfony\Component\HttpFoundation\Response::HTTP_BAD_REQUEST
App\Order\NotEnoughCredit: !php/const Symfony\Component\HttpFoundation\Response::HTTP_BAD_REQUEST
Единственная проблема заключается в том, что исключение по-прежнему регистрируется как ошибка CRITICAL
, которая рассматривается как "неперехваченное исключение". Это регистрируется даже в рабочей среде.
Я бы ожидал, что при преобразовании в правильный код состояния (например, !== 500
) эти исключения будут рассматриваться как «обработанные» и, следовательно, не будут загрязнять журналы.
Бросать исключения из обработчика удобно, потому что это помогает справиться с транзакционностью и автоматически генерирует соответствующее сообщение об ошибке. Это работает для сети и консоли.
Разве эти транзакции не должны рассматриваться как обработанные? Нужно ли создавать другого слушателя исключений, чтобы справиться с этим? И если создать прослушиватель исключений, как это сделать, чтобы он не мешал нормализации ошибок Api-Platform?