针对Ajax请求的Asp.Net MVC操作中处理未处理的异常(错误500响应)的最佳策略是什么?

Kal*_*exx 14 c# asp.net-mvc json exception-handling

我很困惑如何处理这种情况.

通常,当发生未处理的ASP.Net异常时,服务器会发回某种HTML消息,默认的Asp.Net错误处理程序或自定义错误处理程序.在任何一种情况下,HTML都被发回(通常最好是让页面用户友好).

但是,我遇到了一个问题,即在Asp.net MVC控制器操作中发生未处理的异常,这些操作有望为Ajax调用返回JSON.当javascript读取返回的页面(它是HTML而不是预期的JSON)时,由于无法将响应转换为JSON(现在我正在使用ExtJS)而崩溃.我希望在异常时返回Json,以便可以通知用户发生了错误.

我能想到的唯一解决方案是在返回Json的每个操作中执行以下操作:

try { .... }
catch (Exception ex)
{
   return Json(new { success = false, msg = ex.Message });
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢这种方法,因为它需要我捕获所有异常(由于显而易见的原因这是很糟糕的)并且它需要我JsonResult用相同的异常处理代码(这使得以后很难更改)对每个动作进行操作.

是否有更好的方法只返回返回Json的操作方法更合适的错误结果,但仍然保持常规错误页面对非Ajax Web请求用户友好?

ada*_*ord 12

这是我解决这个问题的方法:

public class HandleJsonError : HandleErrorAttribute
{
    public override void OnException(ExceptionContext exceptionContext)
    {
        if (!exceptionContext.HttpContext.Request.IsAjaxRequest() || exceptionContext.Exception == null) return;

        exceptionContext.HttpContext.Response.StatusCode = (int) HttpStatusCode.InternalServerError;
        exceptionContext.Result = new JsonResult
                                   {
                                       Data = new
                                                  {
                                                      exceptionContext.Exception.Message,
                                                      exceptionContext.Exception.StackTrace
                                                  }
                                   };

        exceptionContext.ExceptionHandled = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望继承HandleErrorAttribute并覆盖OnException.这样,您的过滤器只会在出现异常时触发,而不是针对每个请求触发. (6认同)