Глобальная обработка ошибок (вне контроллера) в ASP.NET MVC - PullRequest
7 голосов
/ 31 августа 2009

Допустим, я поместил следующий код где-нибудь на главной странице моего сайта ASP.NET MVC:

throw new ApplicationException("TEST");

Даже с атрибутом [HandleError], установленным на моем контроллере, это исключение все еще всплывает. Как я могу справиться с такими ошибками? Я хотел бы иметь возможность перенаправить на страницу ошибок и по-прежнему иметь возможность регистрировать детали исключения.

Какой лучший способ справиться с чем-то подобным?

Редактировать: Одним из решений, которое я рассматривал, было бы добавление нового контроллера: UnhandledErrorController. Могу ли я добавить метод Application_Error в Global.asax, а затем перенаправить на этот контроллер (где он решает, что делать с исключением)?

Примечание: defaultRedirect в элементе customErrors web.config не передает информацию об исключении.

Ответы [ 5 ]

10 голосов
/ 17 ноября 2010

Включить пользовательские ошибки:

<customErrors mode="On" defaultRedirect="~/Error">
    <error statusCode="401" redirect="~/Error/Unauthorized" />
    <error statusCode="404" redirect="~/Error/NotFound" />
</customErrors>

и перенаправить на пользовательский контроллер ошибок:

[HandleError]
public class ErrorController : BaseController
{
    public ErrorController ()
    {
    }

    public ActionResult Index ()
    {
        Response.StatusCode = (int)HttpStatusCode.InternalServerError;
        return View ("Error");
    }

    public ActionResult Unauthorized ()
    {
        Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        return View ("Error401");
    }

    public ActionResult NotFound ()
    {
        string url = GetStaticRoute (Request.QueryString["aspxerrorpath"] ?? Request.Path);
        if (!string.IsNullOrEmpty (url))
        {
            Notify ("Due to a new web site design the page you were looking for no longer exists.", false);
            return new MovedPermanentlyResult (url);
        }

        Response.StatusCode = (int)HttpStatusCode.NotFound;
        return View ("Error404");
    }
}
5 голосов
/ 01 сентября 2009

Вы можете создать Фильтр, который ищет Исключение в методе OnActionExecuted:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class WatchExceptionAttribute : ActionFilterAttribute {
  public override void OnActionExecuted(ActionExecutedContext filterContext) {
    if (filterContext.Exception != null) {
      // do your thing here.
    }
  }
}

Затем вы можете поместить [WatchException] в метод Controller или Action, и он позволит регистрировать исключения. Если у вас много контроллеров, это может быть утомительно, поэтому если у вас есть общий базовый контроллер, вы можете переопределить OnActionExecuted и сделать то же самое. Я предпочитаю метод фильтра.

5 голосов
/ 31 августа 2009

Поскольку MVC построен поверх asp.net, вы должны иметь возможность определить глобальную страницу ошибки в web.config , так же, как вы могли бы это сделать в веб-формах, например.

   <customErrors mode="On" defaultRedirect="~/ErrorHandler" />
4 голосов
/ 17 ноября 2010

Вы можете найти эту статью полезной: http://blog.ploeh.dk/2009/12/01/GlobalErrorHandlingInASPNETMVC.aspx

1 голос
/ 31 августа 2009

Что касается отображаемой страницы, вам нужно создать customErrors section в вашем файле web.config и настроить его для любых кодов состояния, которые вы хотите обработать.

Пример:

<customErrors defaultRedirect="GenericError.htm" mode="RemoteOnly">
  <error statusCode="500" redirect="InternalError.htm"/>
</customErrors>

Что касается регистрации исключений, я бы рекомендовал использовать ELMAH . Он прекрасно интегрируется с сайтами ASP.NET MVC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...