ASP.net MVC [HandleError] не перехватывает исключения

В двух разных приложениях, одно пользовательское, а другое - пример приложения MVC, которое вы получаете с новым проектом MVC VS2008, [HandleError] не перехватывает исключения.

В примере приложения у меня есть:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        throw new Exception();
        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}

который является просто контроллером по умолчанию с исключением, которое выдается для тестирования.

Но это не работает. Вместо того, чтобы перейти на страницу error.aspx по умолчанию, она отображает отладочную информацию в браузере.

Сначала проблема возникла в пользовательском приложении, над которым я работаю, что привело меня к тестированию с помощью примера приложения. Думая, что это как-то связано с изменениями, которые я сделал в пользовательском приложении, я оставил пример приложения без изменений, за исключением исключения (броска) в методе index.

Я в тупике. Что мне не хватает?

6 ответов

Решение

В файле Web.config измените customErrors:

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

Если режим отключен или RemoteOnly, вместо пользовательской страницы ошибок вы увидите желтый экран смерти. Причина заключается в том, что разработчики обычно хотят получить более подробную информацию о желтом экране смерти.

Важно: будьте осторожны, чтобы на вашей странице ошибок не было ошибок!

Если это произойдет, вы получите страницу с пользовательской ошибкой ASP.NET и закругитесь по кругу и вырветесь. Просто удалите со страницы все, что может вызвать ошибку, и протестируйте ее.

Также в отношении того, что "customErrors" включено или выключено, существует несколько факторов, влияющих на то, будет ли отображаться страница дружественных ошибок (ваша страница Errors.aspx) или нет.

Смотрите этот блог (кроме ниже)

HttpContext.IsCustomErrorEnabled - смотрит на три разных источника

  1. Свойство розничной торговли в разделе раздела web.config. Это полезное свойство, которое нужно установить при развертывании приложения на рабочем сервере. Это отменяет любые другие настройки для пользовательских ошибок.
  2. Свойство mode раздела раздела web.config. Этот параметр указывает, включены ли пользовательские ошибки вообще, и если да, то включены ли они только для удаленных запросов.
  3. Свойство IsLocal объекта HttpRequest. Если пользовательские ошибки включены только для удаленных запросов, вам необходимо знать, поступил ли запрос с удаленного компьютера.

Идея заключается в том, что вы можете отключить "customErrors" во время разработки - когда вы хотите увидеть ошибки, а затем включить их только для производства.

Эта статья MSDN обсуждает этот атрибут дополнительно.

Другая причина этой проблемы может быть,

В шаблонном приложении MVC (создан VS2008 / VS2008 Express) Error.aspx (создан VS) использует мастер-страницу.

Если главная страница получит доступ к каким-либо данным ViewData, она выдаст исключение нулевой ссылки, тогда error.aspx не будет отображаться.

Используйте этот простой код в качестве вашего Error.aspx, он решит проблему (вместе с CustomErrors=On)

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>

Я тоже боролся с этим, и я думаю, что теперь я понимаю проблему.

Короче говоря, требования к [HandleError] работа, как и ожидалось:

Вы должны включить настраиваемые ошибки в web.config И вы также должны указать, где находится ваше представление ошибок в <customErrors> тег.

Пример:

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

Оставляя defaultRedirect="Error" Вместо этого part выдаст ошибку 500 в браузере - НЕ на странице ошибок ASP.NET (YSOD).

Также вам не обязательно находиться в режиме Release. Я проверил это с помощью сборки Debug, и она работала нормально.

Моей средой была Visual Studio 2010 с использованием.NET 4 и стандартным шаблоном проекта "ASP.NET MVC 2 Web Application".

Что меня смутило, так это документация MSDN для класса HandleErrorAttribute. В нем явно не сказано, что вы должны включить пользовательские ошибки в web.config. И я предположил, что все, что мне нужно было [Handle Error] приписывать.

Есть одна глупая ситуация, которая когда-то случилась со мной, поэтому может быть полезна для кого-то.

Убедитесь, что вы добавили <customErrors mode="On" /> правильно web.config файл.


Иногда (особенно когда вы работаете с чем-то вроде Resharper и открываете свои файлы, набирая их имя, но не через Solution Explorer), вы можете просто открыть файл web.config из папки Views или даже из другого проекта.

Остерегайтесь: в моем случае я пытался получить HandleError атрибут, чтобы поймать exception бросили внутрь Controller с конструктор! Конечно это не поймает это. HandleError Атрибут только ловит исключения, брошенные внутрь Controller действия. Это прямо на странице MSDN (следовало бы обратить на это больше внимания):

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

Другое дело, что происходило то, что контроллер OnException(ExceptionContext exceptionContext) переопределенный метод никогда не вызывался. Опять же: конечно, это не будет вызвано, так как я бросил исключение внутри Controller конструктор.

Я потратил 1 час, пытаясь понять это.: о) Надеюсь, это поможет следующей душе...

Как подсказка: помните, что HandleError атрибут только ловит 500 ошибки. Для остальных вы должны объявить <customErrors> раздел в Web.config:

<customErrors mode="On">
  <error statusCode="403" redirect="~/403" />
  <error statusCode="404" redirect="~/404" />
</customErrors>
Другие вопросы по тегам