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

В двух разных приложениях, одно настраиваемое, а другое - пример приложения MVC, которое вы получаете с новым проектом VS2008 MVC, [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 по умолчанию в браузере отображается отладочная информация.

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

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


person Community    schedule 06.03.2009    source источник


Ответы (6)


В Web.config измените customErrors:

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

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

person Craig Stuntz    schedule 06.03.2009
comment
Я сделал это, и это не сработало. Я обнаружил, что в приложении MVC2 в шаблоне по умолчанию есть несколько файлов Web.config. Вам необходимо применить тег customErrors к самому корневому файлу Web.config в вашем решении. - person Mike; 04.10.2010
comment
@Mike, это верно для всех версий MVC. - person Craig Stuntz; 04.10.2010
comment
не сработало для меня .. проверьте мой вопрос: stackoverflow.com/questions/11231165/ - person user20358; 27.06.2012

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

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

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

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

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

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

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

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

person Simon_Weaver    schedule 20.05.2009

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

В шаблоне приложения 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 %>
person Palani    schedule 27.07.2009
comment
Если главная страница обращается к любым ViewData, она выдаст исключение с нулевой ссылкой, эта строка вернула мне здравомыслие. Спасибо! - person Marco M.; 30.06.2010

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

Вкратце, требования для того, чтобы [HandleError] работал должным образом:

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

Пример:

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

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

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

Моей средой была Visual Studio 2010 с использованием .NET 4 и стандартного шаблона проекта «Веб-приложение ASP.NET MVC 2».

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

person RunnerRick    schedule 15.07.2010
comment
Сделал именно это и все еще имел ту же проблему. подробнее здесь: stackoverflow.com/questions/11231165/ - person user20358; 27.06.2012

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

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


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

person Agat    schedule 12.11.2013
comment
Никогда не узнаю, почему они решили, что им нужны две веб-конфиги :( - person martijn; 05.10.2016
comment
Второй - для самого движка Razor. Потенциально вы можете разместить свои представления где угодно, поэтому в проекте может не быть web.config (как для веб-проекта) или вам нужны отдельные настройки. Я согласен, это можно было сделать как-то иначе, чтобы предотвратить такие ошибки при кодировании, но в целом в этом есть смысл. - person Agat; 11.11.2016

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

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

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

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

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

<customErrors mode="On">
  <error statusCode="403" redirect="~/403" />
  <error statusCode="404" redirect="~/404" />
</customErrors>
person Leniel Maccaferri    schedule 08.04.2014