我想创建一个自定义异常过滤器,它将捕获返回JSON结果的控制器操作中抛出的异常。
我想重构以下操作方法:
public JsonResult ShowContent()
{
try
{
// Do some business logic work that might throw a business logic exception ...
//throw new ApplicationException("this is a business exception");
var viewModel = new DialogModel
{
FirstName = "John",
LastName = "Doe"
};
// Other exceptions that might happen:
//throw new SqlException(...);
//throw new OtherException(...);
//throw new ArgumentException("this is an unhandeled exception");
return
Json(
new
{
Status = DialogResultStatusEnum.Success.ToString(),
Page = this.RenderPartialViewToString("ShowContent", viewModel)
});
}
catch (ApplicationException exception)
{
return Json(new { Status = DialogResultStatusEnum.Error.ToString(), Page = exception.Message });
}
catch (Exception exception)
{
return Json(new { Status = DialogResultStatusEnum.Exception.ToString(), Page = "<h2>PROBLEM!</h2>" });
}
}
}
我想要做的是创建一个自定义异常过滤器属性,该属性将捕获操作中引发的任何异常,遵循以下逻辑:
答案 0 :(得分:19)
我发现可以使用this article中的代码解决此问题(对其进行微小更改。)
public class HandleJsonExceptionAttribute : ActionFilterAttribute
{
#region Instance Methods
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (filterContext.Exception != null)
{
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
filterContext.Result = new JsonResult()
{
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
Data = new
{
Error = filterContext.Exception.Message
}
};
filterContext.ExceptionHandled = true;
}
}
#endregion
}
答案 1 :(得分:-2)
public class YourController : BaseController
{
public JsonResult showcontent()
{
// your logic here to return foo json
return Json ( new { "dfd" }); // just a dummy return text replace it wil your code
}
}
public class BaseController : Controller
{
// Catch block for all exceptions in your controller
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
if (filterContext.Exception.Equals(typeof(ApplicationException)))
{
//do json and return
}
else
{
// non applictaion exception
// redirect to generic error controllor and error action which will return json result
}
}
}
请参阅此链接,了解如何创建和使用HandleError attribute
* 编辑 for HandleAttribute for Actions *
//not tested code
public class HandleErrorfilter : HandleErrorAttribute
{
public string ErrorMessage { get; set; }
public override void OnException(ExceptionContext filterContext)
{
string message = string.Empty;
//if application exception
// do something
else
message = "An error occured while attemting to perform the last action. Sorry for the inconvenience.";
}
else
{
base.OnException(filterContext);
}
}
public class YourController : BaseController
{
[HandleErrorfilter]
public JsonResult showcontent()
{
// your logic here to return foo json
return Json ( new { "dfd" }); // just a dummy return text replace it wil your code
}
}