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 по умолчанию отображается информация об отладке в браузере.
Сначала проблема возникла в настраиваемом приложении, над которым я работал, и проверил его с помощью примера приложения. Думая, что это имеет какое-то отношение к изменениям, внесенным мной в пользовательское приложение, я полностью оставил образец приложения без исключения (yuck) броска в методе индекса.
Я в тупике. Что мне не хватает?
Ответы
Ответ 1
В Web.config измените customErrors:
<system.web>
<customErrors mode="On">
</customErrors>
Если режим выключен или удаленно, вы увидите желтый экран смерти вместо страницы пользовательских ошибок. Причина в том, что разработчики обычно хотят получить более подробную информацию о желтом экране смерти.
Ответ 2
Важно: Будьте осторожны, чтобы на вашей странице ошибок не было ошибок!
Если это так, вы попадете на страницу пользовательских ошибок ASP.NET и в итоге кружатся кругами и вырывают волосы. Просто удалите все содержимое страницы, которое может вызвать ошибку и протестировать ее.
Также в отношении ON/OFF "customErrors" есть несколько факторов, способствующих тому, будет ли отображаться страница с дружественной ошибкой (ваша Errors.aspx) или нет.
Смотрите этот блог (кроме ниже)
HttpContext.IsCustomErrorEnabled - рассматривает три разных источника
- Web.config < развертывание > раздел розничной собственности. Это полезное свойство для установки при развертывании ваша заявка на производство сервер. Это переопределяет любые другие настройки для пользовательских ошибок.
- Web.config <customErrors> в режиме раздела. Этот параметр указывает, являются ли пользовательские ошибки и если да, то ли они разрешены только для удаленных запросов.
- Свойство IsLocal объекта HttpRequest. Если пользовательские ошибки включены только для удаленных запросов, вам необходимо знать, является ли запрос удаленный компьютер.
Идея здесь заключается в том, что во время разработки вы можете отключить "customErrors", когда вы хотите увидеть ошибки, а затем включить ее только для производства.
Эта статья MSDN обсуждает атрибут далее.
Ответ 3
Другой причиной этой проблемы может быть,
В приложении Template MVC (сгенерированном VS2008/VS2008 Express) Error.aspx(сгенерированный VS) использует главную страницу.
Если на главной странице будет доступ к любой ViewData, она будет генерировать нулевую ссылку Exception, тогда ошибка .aspx не будет показана.
Используйте этот простой код как ваш Error.aspx, он решит проблему (вместе с CustomErrors = On)
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
Ответ 4
Я тоже боролся с этим, и я считаю, что сейчас понимаю проблему.
Короче говоря, требования к работе [HandleError]
работают так, как ожидалось:
Вы должны включить пользовательские ошибки в web.config И вы также должны указать, где ваше представление об ошибке находится в теге <customErrors>
.
Пример:
<customErrors mode="On" defaultRedirect="Error" />
Если оставить часть defaultRedirect="Error"
, вместо этого вы получите ошибку 500 в браузере - НЕ страницу ошибок ASP.NET(YSOD).
Также вам не обязательно находиться в режиме Release. Я тестировал это с помощью сборки Debug, и он работал нормально.
Моя среда была Visual Studio 2010 с использованием .NET 4 и стандартным шаблоном проекта ASP.NET MVC 2 Web.
Что меня смутило, так это документация MSDN для класса HandleErrorAttribute. В нем явно не говорится, что вы должны включить пользовательские ошибки в web.config. И я предположил, что мне нужен был атрибут [Handle Error]
.
Ответ 5
Есть какая-то глупая ситуация, которая когда-то была со мной, поэтому может быть полезно для кого-то.
Убедитесь, что вы добавили <customErrors mode="On" />
в файл правильный web.config
.
Иногда (особенно, когда вы работаете с чем-то вроде Resharper и открываете свои файлы, набирая их имя, но не через Solution Explorer), вы можете просто открыть web.config либо из папки Views, либо даже из другого проекта.
Ответ 6
Остерегайтесь: в моем случае я пытался получить атрибут HandleError
, чтобы поймать exception
, брошенный внутри Controller
конструктор! Конечно, это не поймает. Атрибут HandleError
только улавливает исключения, сброшенные внутри действий Controller
. Это прямо на странице MSDN (должно было уделить больше внимания этому):
Представляет атрибут, который используется для обработки исключения, которое брошенный методом действия.
Другое дело, что переопределенный метод Controller OnException(ExceptionContext exceptionContext)
никогда не вызывался. Опять же: конечно, это не будет вызвано, поскольку я выбрал исключение внутри конструктора Controller
.
Я потратил 1 час, пытаясь понять это.: o) Надеюсь, что это поможет следующей душе...
Как подсказка: помните, что атрибут HandleError
обнаруживает ошибки 500
. Для других вы должны объявить раздел <customErrors>
в Web.config
:
<customErrors mode="On">
<error statusCode="403" redirect="~/403" />
<error statusCode="404" redirect="~/404" />
</customErrors>