Как я могу обрабатывать исключения в WebAPI 2. методы?

#asp.net #asp.net-mvc #asp.net-web-api

#asp.net #asp.net-mvc #asp.net-веб-api

Вопрос:

В моем приложении WebAPI 2.1 я обрабатываю вставки следующим образом:

     [Route("Post")]
    public async Task<IHttpActionResult> Post([FromBody]City city)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        try
        {
            db.Exams.Add(city);
            await db.SaveChangesAsync(User, DateTime.UtcNow);
        }
        catch (Exception ex)
        {
            var e = ex;
            return BadRequest("Error: City not created");
        }
        return Ok(city);
    }
 

Я использую нечто подобное для обновлений и удалений. Я думаю, что мне следует сделать что-то более значимое с
исключениями, но я не уверен, с чего начать, как с ними обращаться. Я посмотрел на elmah, но там было сказано, что он имеет дело с необработанными исключениями. Означает ли это, что я не должен перехватывать подобные исключения?

Может кто-нибудь дать мне несколько советов относительно того, все ли у меня в порядке, а также должен ли я регистрировать исключения и как?

Ответ №1:

То, что вы делаете, не «плохо», это просто немного многословно и не будет хорошо масштабироваться, если у вас много блоков try / catch по всему вашему коду. Когда возникает исключение, вы решаете, что делать, поэтому возврат неправильного ответа на запрос — это нормально, если это действительно плохой запрос. Есть много вещей, которые вы можете вернуть, в зависимости от того, что пошло не так. Но вы должны решить, что делать, когда исключения генерируются по всему вашему коду, поэтому поддержание этой логики, разбросанной по всему вашему коду, может быстро стать проблемой.

Лучше использовать asp.net платформа обработки исключений веб-api. Например, взгляните на эти статьи:

Идея состоит в том, чтобы централизовать вашу логику в глобальном обработчике исключений и использовать его как единственное место в вашем коде, где вам нужно беспокоиться об этом. Остальная часть вашего кода будет генерировать исключения, и все будет проходить через ваш обработчик исключений / фильтр / и т.д., В зависимости от того, что вы решите.

Например, я создал свои собственные типы исключений (например, CustomExceptionA, CustomExceptionB и т. Д.), И когда я создаю исключение определенного типа, я точно знаю, как обработать его в одном месте и выполнить определенную часть логики. Если я хочу изменить способ обработки определенного типа исключений, то есть только одно место, где я должен внести изменения, а остальная часть кода не будет затронута.

Вторая ссылка на статью выше также включает в себя глобальный регистратор исключений для регистрации таких исключений.