Упрощаем обработку ошибок в ASP.NET MVC приложении.

Каждый раз, при создании нового проекта, приходится проделывать ряд одних и тех же определенных шагов. И вполне естественно, что хочется минимизировать их количество. Давайте посмотрим как можно упросить процесс обработки ошибок и показа сообщений о них.

Что должно происходить при ошибке в веб-приложении? Необходимо занести информацию о ней в журнал, уведомить администратора сайта, а посетителю показать понятную ему страницу с извинениями.

Как сделать описанное выше наверное знают многие. Но не писать же каждый раз один и тот же код? Поэтому воспользуемся библиотекой Moveax.Mvc.ErrorHandler, которая позволяет легко добавлять страницы с сообщениями об ошибках.

Установка

Для её установки выполним в консоли NuGet следующую команду:

PM> Install-Package Moveax.Mvc.ErrorHandler

По завершению в проект будут добавлены Контроллер ErrorController и два Представления:

  • Http404 – страница для сообщения о несуществующем пути;
  • Default – страница по-умолчанию, для всех ошибок у которых нет отдельных Представлений.

Разумеется, в дальнейшем их можно изменить, как того потребует дизайн веб-приложения.

Для завершения установки необходимо в global.asax.cs добавить код для перехвата исключений:

protected void Application_Error(object sender, System.EventArgs e)
{
    var errorHandler = new MvcApplicationErrorHandler(application: this, exception: this.Server.GetLastError()) {
        EnableHttpReturnCodes = false,
        PassThroughHttp401 = false
    };

    errorHandler.Execute();
}

Поведение обработчика ошибок MvcApplicationErrorHandler можно настроить с помощью двух свойств:

  • EnableHttpReturnCodes – определяет будет ли клиенту возвращаться код ошибки (true), или просто страница с уведомлением (false);
  • PassThroughHttp401 – указывает на необходимость игнорировать ошибку HTTP 401, если в приложении предусмотрена отдельная схема для её обработки.

Настройка

При возникновении внештатной ситуации, логика работы ErrorController следующая:

  • каждый раз вызывается метод HandleError(), в которые передается описание ошибки. Здесь можно вставить код, например, ведения журнала;
  • вызывается Действие с именем “Http[код ошибки]” (например, Http404);
  • если такого Действия нет, то используется Действие Default.

Как легко понять, для добавления отдельной страницы с сообщением для конкретной ошибки, достаточно создать Действие и Представление с именем в формате “Http”+[код ошибки]. Пример можно увидеть в самом ErrorController:

public ActionResult Http404(ErrorDescription errorDescription)
{
    return this.View();
}

Класс ErrorDescription содержит информацию об возникшей ошибке:

public class ErrorDescription
{
    public int HttpCode { get; }
    public Exception Exception { get; }
    public HttpRequest Request { get; }
}

Таким образом, библиотека Moveax.Mvc.ErrorHandler позволяет свести всю работу к добавлению Действий и вызову методов ведения журнала.

Обратная связь

Вопросы, советы, предложения принимаются по почте или на сайте проекта.