Обработка ошибок в asp.net mvc 3 - PullRequest
34 голосов
/ 13 мая 2011

Есть ли встроенный или правильный способ обработки ошибок в asp.net mvc 3?

Это то, что я хочу сделать:

  1. Если приложение падает,или выдает ошибку, она переходит на конкретную страницу ошибки.
  2. Я могу выбросить свою собственную ошибку из действия контроллера.(и он переходит на страницу с ошибкой).

Я нашел следующие способы:

  1. Я вижу, что здесь есть длинный путь здесь .(для v1 и v2, но также относится и к v3).
  2. Использование атрибута errorhandle здесь .

Как мне правильно это сделать?

Если решение похоже или похоже на # 1 в списке выше, я использую ninject и не создал базовый класс.Как я все еще делаю это?

Ответы [ 5 ]

15 голосов
/ 13 мая 2011

Я бы предложил реализовать пользовательский фильтр действий HandleErrorAttribute.

См. Эту ссылку для более подробной информации:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

Настройка фильтра действий HandleErrorAttribute дает вам полный контроль над тем, какие действия обрабатываются фильтром, и его легко установить на уровне контроллера или даже на уровне сайта, настроив его на настраиваемом базовом контроллере и имея все ваши контроллеры наследуются от базового контроллера.

Что-то еще, что я делаю с этим, у меня есть отдельный HandleJsonErrorAttribute, который отвечает на вызовы Ajax, возвращая ответ Json, а не пользовательскую страницу.

UPDATE:

По некоторым вопросам ниже приведен пример HandleJsonErrorAttribute, который я использую:

public class HandleJsonErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        var serviceException = filterContext.Exception as ServiceException;

        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } };

        filterContext.ExceptionHandled = true;
    }
}

А вот jQuery, который я использую для обработки этих необработанных исключений:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
    showPopdown($.parseJSON(jqXHR.responseText).message);
});

Это позволяет моим Ajax-методам быть очень легковесными - они просто обрабатывают возвращаемый нормальный Json, а в случае незапланированного исключения сообщение с кодом состояния ошибки переносится в Json и возвращается.

Кроме того, в моей реализации у меня есть пользовательский ServiceException, который я выбрасываю из сервисов, и это отправляет сообщение с сервисного уровня вместо общего сообщения.

14 голосов
/ 17 апреля 2012

Для глобальной обработки ошибок
Все, что вам нужно сделать, это изменить customErrors mode = "On" на странице web.config
Ошибка будет отображаться через Error.cshtml находится в общей папке.

Убедитесь, что макет Error.cshtml не равен нулю .
[Это может быть что-то вроде: @ {Layout = "~ / Views / Shared / _Layout.cshtml"; }
Или удалите Layout = нулевой кодовый блок]
Пример разметки для Error.cshtml: -

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

@model System.Web.Mvc.HandleErrorInfo

<!DOCTYPE html>
<html>
<head>
    <title>Error</title>
</head>
<body>
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
    <p>Controller Name: @Model.ControllerName</p>
    <p>Action Name : @Model.ActionName</p>
    <p>Message: @Model.Exception.Message</p>
</body>
</html>

Для обработки определенных ошибок
Добавьте атрибут HandleError к определенному действию в классе контроллера. Укажите «View» и «ExceptionType» для этой конкретной ошибки.
Пример обработчика исключений NotImplemented:

public class MyController: Controller
    {
        [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))]
        public ActionResult Index()
        {
            throw new NotImplementedException("This method is not implemented.");
            return View();
        }
}
4 голосов
/ 13 мая 2011

Думаю, вы можете сделать это проще всего с помощью библиотеки elmah.

Взгляните на это: http://code.google.com/p/elmah/wiki/MVC и это http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

2 голосов
/ 15 мая 2011

Я думаю, что самый простой способ - использовать атрибут ExceptionHandler, поскольку он готов к использованию в любое время, когда вы создаете новый проект ASP.NET MVC 3.Вы по-прежнему можете настроить Web.config для использования пользовательской страницы ошибок и обработки исключений в глобальном методе Application_Error, как обычно, но при возникновении исключения URL-адрес не отображается так же хорошо, как в новом MVC 3.

1 голос
/ 23 июля 2012

вы можете создать пользовательское исключение в MVC, если хотите настроить способ обработки исключений. Вы можете найти полезный пост здесь. http://www.professionals -helpdesk.com / 2012/07 / создание-заказ исключений фильтр-в-mvc.html

...