在asp.net mvc结构中处理错误和捕获异常的可接受方法是什么?
普遍的共识是让例外起泡.
那么你可以处理什么层(View或Controller)来处理异常(抓住它们/显示用户友好的文本等).我的预感是,它在控制器中完成?
编辑:
我想避免在每个控制器动作中重复相同的错误处理代码.我正在寻找一个简洁的例子,说明如何在不重复相同的代码的情况下实现错误处理.
普遍的共识是让例外起泡.
那么你可以处理什么层(View或Controller)来处理异常(抓住它们/显示用户友好的文本等).我的预感是,它在控制器中完成?
编辑:
我想避免在每个控制器动作中重复相同的错误处理代码.我正在寻找一个简洁的例子,说明如何在不重复相同的代码的情况下实现错误处理.
解决方法
处理控制器中的异常可能会导致大量的重复代码.更好的方法是在扩展HandleErrorAttribute的动作过滤器中处理它们.在那里,您可以记录异常,然后重定向到一个页面,该页面显示一条很好的消息,指示用户发生错误.
但是,在某些情况下,您需要处理控制器方法中的异常,例如,当您可以从异常中恢复并向用户显示适当的消息,例如由业务层抛出的异常,指示值您提供的无效.在这种情况下,您应该捕获特定的异常,并向用户显示相同的视图以及相应的消息.
编辑:
- public class CustomErrorHandlerAttribute : HandleErrorAttribute
- {
- public override void OnException(ExceptionContext filterContext)
- {
- var logger = log4net.LogManager.GetLogger("SomeLoggerHere");
- logger.Error("An unhandled error occurred",filterContext.Exception);
- if (filterContext.HttpContext.Request.IsAjaxRequest())
- {
- filterContext.HttpContext.Response.Clear();
- filterContext.HttpContext.Response.Status = "500 Internal Server Error";
- filterContext.Result = new JsonResult { Data = new { ErrorMessage = filterContext.Exception.Message } };
- filterContext.ExceptionHandled = true;
- }
- else
- {
- base.OnException(filterContext);
- }
- }
}
编辑2:
然后你使用这样的属性:
- [CustomErrorHandler]
- public class AnyController : Controller
- {
- ...
- }