Подтвердить что ты не робот

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) броска в методе индекса.

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

4b9b3361

Ответ 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>