ASP.NET MVC Controller.OnException не вызывается - PullRequest
9 голосов
/ 06 июня 2009

У меня есть базовый класс контроллера, где я переопределяю метод обработчика Controller.OnException, чтобы обеспечить общую обработку ошибок для определенных типов контроллеров, которые будут наследоваться от этого класса (это контроллеры API, которые будут возвращать результаты JSON ). Метод OnException никогда не вызывается, когда исключение вызывается контроллером. Кто-нибудь видит, что я делаю неправильно, или есть лучший способ справиться с этой ситуацией?

Использование MVC 1.0

Базовый класс:

public class APIController : Controller
    {

        protected override void OnException(ExceptionContext filterContext)
        {
           //This is never called
            filterContext.Result =
                new JsonResult(); 
            base.OnException(filterContext);
        }


    }

Класс наследования:

public class MyController : APIController
    {
public AjaxResult ForcedException()
        {
            throw new SystemException();
        }
}

Ответы [ 6 ]

10 голосов
/ 07 июня 2009

Если я правильно понимаю ваш вопрос - ваше Исключение должно быть помечено как "обработанное" в вашем Исключении. Попробуйте это:

filterContext.ExceptionHandled = true;
2 голосов
/ 17 июня 2009

В документации MSDN (http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx) указано, что метод OnException «вызывается, когда в действии возникает необработанное исключение».

Итак, похоже, что он может сработать, только когда в методе действия возникает необработанное исключение.

Я создал новый контроллер с одним действием Index. И метод OnException действительно выполняется. Я также попытался вызвать SystemException () и метод OnException также сработал.

    public ActionResult Index ( )
    {
        throw new NotImplementedException ( );
    }
1 голос
/ 28 ноября 2012

У меня была точно такая же проблема в моем проекте ASP.NET MVC 3.

Оказывается, это особенность Visual Studio и сервера разработки. В режиме отладки вы вернетесь в Visual Studio и получите диалоговое окно исключений по умолчанию.

Один из способов предотвратить это - изменить режим компиляции в вашем Web.config с этого:

<compilation debug="true" targetFramework="4.0">

К этому:

<compilation debug="false" targetFramework="4.0">

Вы также можете оставить для режима отладки значение true, но для проверки работы своего приложения выберите Start without debugging option в меню Visual Studio (вызывается нажатием Ctrl+F5.

1 голос
/ 01 октября 2009

Вы вызываете действие контроллера из модульного теста или через ASP.NET? Если вы вызываете метод непосредственно в тесте, скажем, через NUnit, то OnException не сработает: тестовая среда обработает исключение и превратит его в неудачный тест.

0 голосов
/ 09 марта 2018

Для Controller.OnException действуют те же правила, что и для HandleErrorAttribute

Здесь указана необходимая конфигурация для HandleErrorAttribute https://stackoverflow.com/a/528550/939634

Если у вас customError в web.config установлено значение mode="RemoteOnly" и вы выполняете локальную отладку или у вас mode="Off", исключения не будут обработаны, и вы увидите желтый экран ASP.Net с трассировкой стека .

Если вы установили mode="On" или вы просматриваете сайт удаленно и у вас есть mode="RemoteOnly", ваш OnException метод будет работать правильно.

0 голосов
/ 07 июня 2009

Примените атрибут [HandleError] к классу.

...