ASP.net MVC [HandleError] не перехватывает исключения - PullRequest
39 голосов
/ 06 марта 2009

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

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

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

Ответы [ 6 ]

67 голосов
/ 06 марта 2009

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

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

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

16 голосов
/ 20 мая 2009

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

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

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

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

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

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

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

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

13 голосов
/ 27 июля 2009

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

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

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

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

<%@ Page Language="C#"  Inherits="System.Web.Mvc.ViewPage<System.Web.Mvc.HandleErrorInfo>" %>
<%= Model.Exception.Message %>
8 голосов
/ 15 июля 2010

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

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

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

Пример:

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

Если вы пропустите часть defaultRedirect="Error", в браузере появится ошибка 500, а НЕ страница ошибок ASP.NET (YSOD).

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

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

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

5 голосов
/ 12 ноября 2013

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

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


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

1 голос
/ 08 апреля 2014

Осторожно: в моем случае я пытался получить атрибут HandleError, чтобы поймать exception, брошенный внутрь конструктора Controller s ! Конечно это не поймает это. Атрибут HandleError только перехватывает исключения, выданные внутри Controller actions . Это прямо на странице 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>
...