Обработка ошибок ASP.Net MVC с использованием атрибутов фильтров действий

Я пытаюсь реализовать обработку ошибок с помощью атрибутов фильтров действий в соответствии с блог

Мой код выглядит следующим образом:

[HandleError]
[HandleError(ExceptionType = typeof(NullReferenceException), View = "CustomError")]
public class ArticlesController : Controller
{
    public object OhDearACrash()
    {
        throw new Exception("Oh Dear");
    }

    public object NullRefCrash()
    {
        throw new NullReferenceException();
    }

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

OhDearACrash: исключение не было обработано кодом пользователя

NullRefCrash: исключение NullReferenceException не было обработано пользовательским кодом

и поэтому необработанное исключение подхватывается Default [HandleError], который направляет к View/Shared/Error.aspx, который обрабатывает ошибку.

Как мне обработать необработанное исключение?


person Nicholas Murray    schedule 29.12.2009    source источник
comment
Есть ли у вас все необходимое для правильной обработки исключения NullReferenceException? Какое исключение возникает, когда вы говорите OhDearACrash в своем посте?   -  person Tomas Aschan    schedule 30.12.2009
comment
Я могу перейти на страницу CustomError (как показано ниже), но я полагаю, что не могу правильно обработать ее в CustomError, поскольку Action = ‹%= ((HandleErrorInfo)ViewData.Model).ActionName%›‹br /› также получает NullReferenceException, что не было обработано по коду пользователя   -  person Nicholas Murray    schedule 30.12.2009


Ответы (1)


Фильтры действий выполняются один за другим. В вашем случае проблема, вероятно, заключается в том, что общий фильтр действий HandleError выполняется перед конкретным.

Вы можете повлиять на порядок выполнения, установив свойство «Порядок» вашего фильтра действий:

[HandleError(Order = 2)]
[HandleError(Order = 1, ExceptionType = typeof(NullReferenceException), View = "CustomError")]
public class ArticlesController : Controller
{
}
person jeroenh    schedule 29.12.2009
comment
Если, как говорит Скотт, «вы можете также указать определенные типы исключений, которые вы хотите перехватить, и указать для них пользовательские представления ошибок, указав свойства ExceptionType и View в атрибутах [HandleError]:» зачем мне нужен порядок, когда я указываю Тип исключения? - person Nicholas Murray; 30.12.2009
comment
Если сначала сработает общий фильтр HandleError, он обработает исключение (любое исключение, а также ваше исключение NullReference). Ваш второй фильтр действия HandleError больше не будет срабатывать. - person jeroenh; 30.12.2009
comment
Да, спасибо, посмотрел MSDN, и там написано: «Если номер заказа не указан, номер заказа равен -1». Это означает, что фильтр применяется перед любыми другими фильтрами HandleErrorAttribute, за исключением других фильтров, порядок которых также равен -1. и «Фильтры с одинаковым порядковым номером применяются в неопределенном порядке». поэтому, конечно, именно поэтому фильтр HandleError может быть поражен первым. - person Nicholas Murray; 30.12.2009