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

Обработка ошибок в asp.net mvc 3

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

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

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

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

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

Как я могу справиться с этим надлежащим образом?

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

4b9b3361

Ответ 1

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

Ошибка будет отображаться через Error.cshtml в общей папке.

Убедитесь, что макет Error.cshtml не равен null.
[Это может быть что-то вроде: @{Layout = "~/Views/Shared/_Layout.cshtml"; }
Или удалите Layout = null code block]
Пример разметки для 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 Exception Handler:

public class MyController: Controller
    {
        [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))]
        public ActionResult Index()
        {
            throw new NotImplementedException("This method is not implemented.");
            return View();
        }
}

Ответ 2

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

Ответ 4

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