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 - смотрит на три разных источника
- Свойство розничной торговли в разделе
раздела web.config. Это полезное свойство, которое нужно установить при развертывании приложения на рабочем сервере. Это отменяет любые другие настройки для пользовательских ошибок. - Свойство mode раздела
раздела web.config. Этот параметр указывает, включены ли пользовательские ошибки вообще, и если да, то включены ли они только для удаленных запросов. - Свойство 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>