Closed s4xack closed 2 years ago
Введение: я нашёл два варианта для отлова отлова ошибок
У каждого есть свой нюанс 1.Требует вернуть объект респонса, то есть у всех респонсов должен быть пустой конструктор или статик метод для создания 2.Просто выглядит не очень, т.к. для отлова конкретных ошибок их нужно ифать
Тут можно глянуть чуть более наглядно
В итоге есть какой-то третий путь или используем один из этих?
Просто выглядит не очень, т.к. для отлова конкретных ошибок их нужно ифать
Ситуаций в, которых тебе нужно что-то конкретное отлавливать, да еще и на уровне всего приложения лучше всего избегать. Да и в целом хэндлинг ошибок зачастую нужен, тольчо чтобы не отдавать наверх внутренности каких-то сторонних либо, в остальных ситуаций ты грубо говоря хэндлишь все до факта самой ошибки (валидируешь аргументы перед вызовом БЛ, тыкаешь какие-то методы, которые говорят, что то или иное действие допустимо и т.д.) В тех ситуациях когда ошибка является "допустимым" сценарием, то есть какие-то ситуации валидность которых можно узнать только во время выполнения, хорошо бы использовать Result<T, E>. То есть твой доменный метод либо, при успешном завершениии, возвращает свой результат, либо, при каком-то ошибочном состоянии, отдает сущность ошибки. На уровне домена ошибкой может выступать, например иерархия рекордов, что-то типо:
public record CreateTeacherError
{
public record SomeError(SomeErrorArg arg) : CreateTeacherError;
}
На уровне хэндлера такой ошибкой будет некий ErrorDetails, некая моделька, которая для юзера является понятной ошибочкой с заголовком, текстом, статускодом и тд. Вот этот набор параметров подбирается согласно требованиям фронта.
Для резалтов уже придумали много разных штук типо FluentResults, часто вообще что-то самописное юзают с нужными хэлперами и тд
Еще я немного позаимствовал статью с работы и засунул ее в md, тут какжется более развернуто и точно сказано о том, что я хотел донести
TL;DR; Кажется что сейчас достаточно обычного IExceptionFilter, который будет мапить ошибку в простенькую модель с месджом, стэктрейсом и т.д.
Нужно подключить глобальный хэндлер ошибок,