ASP.Net MVC - 如何在JSON操作中处理异常(返回JSON错误信息),还发布过滤器的异常?

But*_*aur 5 c# asp.net-mvc json exception-handling filter

我正在使用过滤器来记录由以下操作引发的异常:

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception != null)
        {
           //logger.Error(xxx);
        }
        base.OnActionExecuted(filterContext);
    }
Run Code Online (Sandbox Code Playgroud)

现在我想处理我的所有JSON操作以返回带有异常信息的JSON结果.这允许Ajax调用确定服务器上是否有任何错误,而不是接收错误页面源,这对Ajax来说是无用的.我在AppControllerBase中为JSON操作实现了这个方法:

    public ActionResult JsonExceptionHandler(Func<object> action)
    {
        try
        {
            var res = action();
            return res == null ? JsonSuccess() : JsonSuccess(res);
        }
        catch(Exception exc)
        {
            return JsonFailure(new {errorMessage = exc.Message});
        }
    }
Run Code Online (Sandbox Code Playgroud)

这很好用,但很明显catch()语句阻止所有过滤器处理异常,因为实际上没有抛出异常.有没有办法如何为过滤器留下可用的异常(filterContext.Exception)?

But*_*aur 0

解决方案:

行动:

public ActionResult JsonExceptionHandler(Func < object > action) {
  try {
    var res = action();
    return res == null ? JsonSuccess() : JsonSuccess(res);
  } catch (Exception exc) {
    controller.ControllerContext.HttpContext.AddError(exc);
    return JsonFailure(new {
      errorMessage = exc.Message
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

筛选:

public override void OnActionExecuted(ActionExecutedContext filterContext) {
  var exception = filterContext.Exception ? ? filterContext.HttpContext.Error;
  if (exception != null) {
    //logger.Error(xxx);
  }

  if (filterContext.Result != null &&
    filterContext.HttpContext.Error != null) {
    filterContext.HttpContext.ClearError();
  }

  base.OnActionExecuted(filterContext);
}
Run Code Online (Sandbox Code Playgroud)

  • 请发布您的 JsonFailure &amp;&amp; JsonSuccess (7认同)