2015-07-16 2 views
4

У меня есть веб-приложение ASP.NET MVC, и я пытаюсь улучшить его возможности обработки ошибок. Я прочитал базовый класс HandleErrorAttribute и хотел использовать его с моими классами контроллеров. Однако, когда я бросаю тестовое исключение из метода в одном из моих классов контроллера, который украшен этим атрибутом, OnException переопределяет мой производный класс: не. Вместо того, чтобы мой получена ошибка класс обработки-х OnException метод будучи вызваны, я вижу сообщение общего ошибки в формате XML и сообщение родовой ошибки не найти нигде в моем приложении:Произвольный класс HandleErrorAttribute не перехватывает исключения?

<Error> 
    <Message>An error has occurred.</Message> 
</Error> 

Что я делаю неправильно?

Примечание Я попытался добавить следующие пользовательские ошибки элемента в system.web элемента в моем web.config файла, как показано на этом посту SO, но это не помогло:

ASP.net MVC [HandleError] not catching exceptions

<customErrors mode="On" defaultRedirect="Error" /> 

Вот мой HandleErrorAttribute производный класс:

public class HandleControllerErrors : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     // Breakpoint set here never hit. 

     Exception ex = filterContext.Exception; 
     filterContext.ExceptionHandled = true; 
     var model = new HandleErrorInfo(filterContext.Exception, "Controller", "Action"); 

     filterContext.Result = new ViewResult() 
     { 
      // Use the ErrorInController view. 
      ViewName = "ErrorInController", 
      ViewData = new ViewDataDictionary(model) 
     }; 
    } 
} 

Вот как я украшаю свой класс контроллера. У меня есть метод в нем, что принудительно генерирует исключение, которое не внутри TRY/поймать блока в .:

[HandleControllerErrors] 
public class ValuesController : ApiController 
{ 
    [Route("Api/TestException/")] 
    public IHttpActionResult TestException() 
    { 
     throw new InvalidCastException("Fake invalid cast exception."); 
    } 
} 
+0

Так MVC или приложение Web API? Или оба? Даже если обе, какая часть? – abatishchev

ответ

2

ApiController не совпадает с MVC-контроллером, и, как таковой, это, вероятно, не сработает. Обработка ошибок обрабатывается по-разному в Web API. Проверьте ссылку для атрибутов обработки исключений для Web API:

http://www.asp.net/web-api/overview/error-handling/exception-handling

+0

Спасибо, что исправил его. Я создал атрибут фильтра ExceptionFilterAttribute для обработки исключений Web Api Controller. Слишком плохо, что у вас должны быть два разных механизма обработки ошибок для Web Api Controllers и всего остального. Но так оно и есть. –

0

Попробуйте добавить это к глобальным фильтрам:

filters.Add(new HandleControllerErrors {View = "Error"}); 
Смежные вопросы