В веб-формах MVC у нас есть фильтр ошибок, имплементирующий IExceptionFilter. Это гарантирует, что сюда будет перенаправлено любое исключение в приложении.
Есть ли для этого аналог в ASP.Net? Вызывается ли метод Application_Error для всех исключений?
Во-первых, вам следует проверьте официальную документацию.
Вы спрашиваете о веб-формах, а затем ссылаетесь на 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.
См. Обработка ошибок ASP.NET