Эквивалент фильтра исключений MVC в веб-формах Asp.net

В веб-формах MVC у нас есть фильтр ошибок, имплементирующий IExceptionFilter. Это гарантирует, что сюда будет перенаправлено любое исключение в приложении.

Есть ли для этого аналог в ASP.Net? Вызывается ли метод Application_Error для всех исключений?

См. Обработка ошибок ASP.NET

Rui Jarimba 26.09.2018 13:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
353
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, вам следует проверьте официальную документацию.

Вы спрашиваете о веб-формах, а затем ссылаетесь на ASP.NET, поэтому я не совсем уверен, спрашиваете ли вы о MVC или о чем-то еще, но я собираюсь использовать MVC. 1 и 3 применяются независимо.

Я нашел более сжатый хорошая статья Stackify, который я здесь перефразирую. Я собираюсь игнорировать обработку ошибок, которая не является глобальным решением (HandleErrorAttribute и т. д.).

В зависимости от ваших потребностей существует несколько вариантов работы с необработанными исключениями:

1) Общие страницы Erorr, настроенные в разделе Web.Config

<system.web>
    <customErrors mode = "On" defaultRedirect = "~/ErrorHandler/Index">
        <error statusCode = "404" redirect = "~/ErrorHandler/NotFound"/>
    </customErrors>
<system.web/>

Если вы настроили что-то похожее на приведенный выше код (заменив примеры путей на пути к вашему обработчику ошибок или другим веб-страницам), вы можете настроить страницу ошибок по умолчанию, а также страницы ошибок для каждого типа кода состояния. Если вы установите mode = "RemoteOnly", вы увидите эти настраиваемые страницы ошибок только тогда, когда не на локальном хосте, что может быть очень полезно для отладки.

Например, у меня в проекте есть следующее:

<customErrors mode = "RemoteOnly" defaultRedirect = "/ErrorHandler">
  <error statusCode = "400" redirect = "~/ErrorHandler/?errorCode=400" />
  <error statusCode = "401" redirect = "~/ErrorHandler/?errorCode=401" />
  <error statusCode = "403" redirect = "~/ErrorHandler/?errorCode=403" />
  <error statusCode = "404" redirect = "~/ErrorHandler/?errorCode=404" />
  <error statusCode = "500" redirect = "~/ErrorHandler/?errorCode=500" />
</customErrors>

Это означает, что любое общее исключение с этими кодами состояния автоматически обрабатывается для меня. ErrorHandler - это простой контроллер, который я создал для этого. Однако это не позволяет выполнять код для необработанного исключения, а просто отображает страницу общей ошибки.

2) Переопределить функцию OnException на контроллере

Это требует, чтобы вы настроили класс интерфейса для ваших контроллеров и разработали метод переопределения для метода OnException контроллера.

Из статьи Stackify они разрабатывают класс с именем UserMvcController, который наследуется от Controller. У меня лично есть класс с именем IBaseController, в котором этот метод, наряду с другими, переопределен.

Пример простого интерфейса:

public class UserMvcController : Controller
{
   protected override void OnException(ExceptionContext filterContext)
   {
      filterContext.ExceptionHandled = true;

      //Log the error!!
      _Logger.Error(filterContext.Exception);

      //Redirect or return a view, but not both.
      filterContext.Result = RedirectToAction("Index", "ErrorHandler");
      // OR 
      filterContext.Result = new ViewResult
      {
         ViewName = "~/Views/ErrorHandler/Index.cshtml"
      };
   }
} 

Пример из одного из моих проектов с несколькими другими функциями. Все эти функции доступны на ваших контроллерах, если ваши контроллеры наследуются от вашего базового класса:

public class IBaseController : Controller
{
    // Function to set up modal pup with Error styling
    public void Error(string errorHeader, string errorMessage)
    {
        ViewBag.ErrorHeader = errorHeader;
        ViewBag.ErrorMessage = errorMessage;
        ViewBag.JavaScriptHandler = "ShowErrorModal();";
    }

    // Function to set up modal pup with Informational styling
    public void Info(string infoHeader, string infoMessage)
    {
        ViewBag.InfoHeader = infoHeader;
        ViewBag.InfoMessage = infoMessage;
        ViewBag.JavaScriptHandler = "ShowInfoModal();";
    }

    // Function to override OnException method to pass exception info the ErrorController
    protected override void OnException(ExceptionContext filterContext)
    {
        filterContext.ExceptionHandled = true;

        //Redirect or return a view, but not both.
        filterContext.Result = RedirectToAction("Message", "ErrorHandler", new { area = "", errorException = filterContext.Exception.Message });
    }
}

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

3) Используйте Application_Error

В вашем файле Global.asax вы также можете настроить функцию Application_Error () для обработки ошибок.

public class MvcApplication : System.Web.HttpApplication
{
   protected void Application_Start()
   {
      AreaRegistration.RegisterAllAreas();
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
      RouteConfig.RegisterRoutes(RouteTable.Routes);
      BundleConfig.RegisterBundles(BundleTable.Bundles);
   }

   protected void Application_Error()
   {
      var ex = Server.GetLastError();
      //log the error!
      _Logger.Error(ex);
   }
}

Это позволит вам выполнять простую регистрацию и универсальные типы обработки ошибок. Я полагаю, вы можете реализовать здесь что-то очень надежное, но я предпочитаю выполнять большую часть своей логической обработки внутри контроллера.

Заключительное замечание

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

Лучший.

Фильтры исключений - это способ обработки исключений в MVC в одном месте. Я ищу аналог того же в веб-формах asp.net.

jkr 27.09.2018 05:27

Другие вопросы по теме