Обработка исключений в ASP.NET MVC

Пусть есть MVC приложение. И мы хотим при возникновении исключений их обрабатывать, например, записывать в лог. Далее будет рассказано, как это можно сделать.

Класс Controller имеет виртуальный метод OnException который вызывается при возникновении исключений. Переопределив данный метод у себя в контроллере мы можем получать всю информацию, связанную с исключением и совершать какие-то действия в момент возникновения исключения в данном контроллере.

protected override void OnException(ExceptionContext filterContext)
{
    base.OnException(filterContext);

    var exception = filterContext.Exception;
    var httpContext = filterContext.HttpContext;

    //Логика записи в лог
}

При таком способе нам нужно в каждом созданном контроллере переопределять метод OnException. Что не совсем красиво.

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

Создать класс унаследованный от HandleErrorAttribute и переопределить в нем метод OnException, в котором следует поместить всю логику связанную с обработкой исключения:

public class HandleErrorsAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        base.OnException(filterContext);

        var exception = filterContext.Exception;
        var httpContext = filterContext.HttpContext;

        //Логика записи в лог
    }
}

Далее нужно добавить созданный класс, как атрибут ко всем имеющимся классам контроллеров.

[HandleErrors]
public class AccountController : Controller
{
...

После этого все исключения будут обрабатываться в одном месте.

.NET , MVC


Комментировать

Комментарии

arusland.blogspot.com

27.07.2009 10:35

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