处理asp.net mvc中的错误和异常

sar*_*ake 10 error-handling asp.net-mvc

在asp.net mvc结构中处理错误和捕获异常的可接受方法是什么?普遍的共识是异常泡沫化.那么什么层(视图或控制器)你会处理异常(捕获/显示用户友好的文本等).我的预感是它是在控制器中完成的?编辑: 我想避免在每个控制器操作中重复相同的错误处理代码 ..因此我正在寻找一个简洁的示例,说明如何实现错误处理而不重复相同的代码.

uvi*_*ita 16

处理控制器中的异常可能会导致大量重复代码.更好的方法是在扩展的动作过滤器中处理它们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);
         }

    }
Run Code Online (Sandbox Code Playgroud)

}

编辑2: 然后你使用这样的属性:

[CustomErrorHandler]
public class AnyController : Controller
{
...
}
Run Code Online (Sandbox Code Playgroud)