Перехват исключений в фильтре

92
03 сентября 2019, 13:20

Приложение ASP.NET MVC Методы контроллера разные:

  • Возвращают JSON-ответ, например {status:0, message:"Данные успешно сохранены"}
  • Возвращают JSON в формате Javascript-библиотеки datatables.net

При этом могут возникать два вида ошибок:

  • Ошибка в бизнес-логике: от пользователя пришли некорректные данные и ему нужно возвратить такой JSON: {status:1, message:"Не указана дата ..."}
  • Ошибка системы (некорректный SQL-запрос, потеря связи с БД, прочая runtime ошибка) - в этом случае пользователю нужно возвратить JSON {status:1, message:"Что-то пошло не так, попробуйте позднее"}, а подробности исключения сохранить в log-файл (возможно с отправкой сообщения администратору)

Не хотелось бы в коде контроллеров густо рассыпать try-catch, есть мысль ошибки валидации данных бросать исключениями, отлавливать их и системые ошибки в одном месте.

Возможно ли реализовать такое с помощью фильтров или как-то ещё?

Answer 1

Да, это можно сделать. Нужно реализовать интерфейс IExceptionFilter и полученный класс применить к нужным контроллерам. Вот ссылка на статью с примерами и описанием: Фильтры исключений

При необходимости можно применить фильтр глобально. Пример:

using System.Web.Mvc;
namespace WebApp2.Config
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new RangeExceptionAttribute());
        }
    }
}

Этот код вызывается из Global.asax

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        // Другая инициализация.
    }
}

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

READ ALSO
Передача модели из ajax запроса в экшен

Передача модели из ajax запроса в экшен

Есть проблема с передачей данных из ajax запроса в экшен контроллера

89
Список Анимаций Unity

Список Анимаций Unity

Доброго времени суток!

95
Как сделать игру на c# wpf?

Как сделать игру на c# wpf?

Я делаю некое подобие игры на wpf, и мне интересно как можно сделать, чтоб другие программы определяли моё приложение как игру? Чтоб, например,...

116
C# WPF изменить MouseButtonState

C# WPF изменить MouseButtonState

Как мне убрать MouseButtonStatePressed с кнопки мышки програмно? Т

103