ASP.NET MVC Controller.OnException не вызывается

У меня есть базовый класс контроллеров, где я переопределяю метод-обработчик 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 ответов

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

filterContext.ExceptionHandled = true;

В документации 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 ( );
    }

У меня была точно такая же проблема в моем проекте 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 из меню визуальной студии (вызывается нажатием Ctrl+F5,

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

Те же правила применяются для Controller.OnException что касается HandleErrorAttribute

Требуемый конфиг для HandleErrorAttribute здесь отмечается /questions/42862609/atribut-kazhetsya-ne-dejstvuet-voobsche/42862631#42862631

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

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

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

Другие вопросы по тегам