Глобальная обработка ошибок в ASP.NET MVC. Возможный? - PullRequest
3 голосов
/ 09 марта 2012

Кажется, что Application_Error в Global.asax только перехватывает ошибки, генерируемые средой выполнения MVC. Существуют и другие решения, которые включают переопределение Controller.OnException.

Можно ли создать обработчик ошибок, который будет перехватывать все ошибки со всех контроллеров (включая сгенерированные моим кодом)?

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

Да - если вы посмотрите на Global.asax, HandleErrorAttribute добавится к GlobalFilterCollection

        filters.Add(new HandleErrorAttribute());

Но атрибут по умолчанию HandleErrorAttribute будет обрабатывать только внутренние ошибки сервера, то есть все исключения, которые не являются HttException и HttpExceptions с кодом ошибки 500. Вы можете наследовать этот атрибут для обработки всех исключений и дальнейшей настройки поведения по умолчанию.

HandleErrorAttribute - это стандартный способ обработки ошибок в asp.net mvc.

1 голос
/ 09 марта 2012

Так же, как сказал archil, вам даже не нужно украшать контроллеры / действия с помощью [HandleError], так как он включен по умолчанию (в MVC3).

При ошибке он вернет представление Error.cshtml, которое, если вы использовали шаблон проекта, находится в Views / Shared.

Вы можете настроить его немного, если хотите, модель - HandleErrorInfo, так что вы можете вытащить имя контроллера, действие, сообщение и трассировку стека, если по какой-либо причине вам понадобится хорошее, настраиваемое сообщение об исключении. Здесь есть одна загвоздка: на этой странице не должно быть логики / операций.

И вам придется включить пользовательские ошибки в Web.config, в противном случае вы получите стандартный желтоватый экран в любом случае:

<system.web>
    <customErrors mode="On"/>
    ...
</system.web>

А в customErrors вы можете определить одну статическую резервную страницу, если все остальное не сработает.

...