Обработка ошибок в asp.net mvc 3
Есть ли встроенный или правильный способ обработки ошибок в asp.net mvc 3?
Это то, что я хочу сделать:
- Если приложение выходит из строя или выдает ошибку, оно переходит на страницу с конкретной ошибкой.
- Я могу выбросить свою собственную ошибку из действия контроллера. (и он переходит на страницу с ошибкой).
Я нашел следующие способы:
- Я вижу, что это долгий путь
здесь. (для v1 и v2, но также
применяется к v3).
- Использование атрибута errorhandle здесь.
Как я могу справиться с этим надлежащим образом?
Если решение похоже или похоже на # 1 в списке выше, я использую ninject, и я не создал базовый класс. Как я могу это сделать?
Ответы
Ответ 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
, который я выкидываю из служб, и это отправляет сообщение с уровня сервиса вместо общего сообщения.
Ответ 3
Самый простой способ, я думаю, вы можете сделать это, используя библиотеку elmah.
Взгляните на это: http://code.google.com/p/elmah/wiki/MVC и это
http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx
Ответ 4
Я думаю, что самый простой способ - использовать атрибут ExceptionHandler, поскольку он готов к использованию в любое время, когда вы создаете новый проект ASP.NET MVC 3. Вы все равно можете настроить Web.config на использование настраиваемой страницы ошибок и обработку исключений в глобальном методе Application_Error, как обычно, но при возникновении исключения URL-адрес не отображается так же хорошо, как новый способ MVC 3.
Ответ 5
вы можете создать настраиваемое исключение в MVC, если вы хотите настроить способ обработки исключений.
вы можете найти полезный пост здесь.
http://www.professionals-helpdesk.com/2012/07/creating-custom-exception-filter-in-mvc.html