ASP.NET MVC 中的异常处理
创建一个自定义的“HandleErrorAttribute”类:
public class CustomErrorHandler : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
//If the request is AJAX return JSON, else return View
if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
{
// Log exception first
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.Result = new JsonResult
{
Data = new
{
success = false,
message = "An error occured while sending form.",
type = filterContext.Exception.GetType().Name,
exception = filterContext.Exception.ToString()
//Message = "Error Processing your request. Technical detail: " + filterContext.Exception.Message,
//TechnicalDetails = filterContext.Exception.Message + System.Environment.NewLine + filterContext.Exception.StackTrace
},
JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
// Let the system know that the exception has been handled
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
// Avoid IIS7 getting in the middle
//Response.TrySkipIisCustomErrors = true;
}
else
{
// Normal Exception. So, let it handle by its default ways
base.OnException(filterContext);
}
// Write error logging code here if you wish.
// If want to get different of the request
//var currentController = (string)filterContext.RouteData.Values["controller"];
//var currentActionName = (string)filterContext.RouteData.Values["action"];
}
}
将这个类装饰为跨控制器或动作方法的属性(无需使用 try-catch 块)
[CustomErrorHandler]
public JsonResult DeleteConfirmed(int id)
{
if (ModelState.IsValid)
{
Schedule schedule = repository.Schedules.FirstOrDefault(m => m.Id == id);
if (schedule == null)
{
return Json(new { success = false, message = "User not found." });
}
else
{
Schedule deletedSchedule = repository.DeleteSchedulePermanently(id);
if (deletedSchedule != null)
{
return Json(new { success = true, message = "Succeeded" });
}
}
}
// If we got this far, something failed, redisplay form
return Json(new { success = false, message = "Please check errors." });
}
在AJAX调用中,获取自定义“HandleErrorAttribute”类中创建的异常属性。
$.ajax({
//code omitted for brevity
error: function (jqXHR, textStatus, errorThrown) {
if (jqXHR.status == 401) {
// perform a redirect to the login page since we're no longer authorized
}
if (jqXHR.responseJSON != null) {
displayAlert('danger', 'warning', jqXHR.responseJSON.message + " Error Details: " + jqXHR.responseJSON.exception, '#result');
}
},
success: function (response, textStatus, XMLHttpRequest) {
if (response.success) {
showToast('success', 'Result', response.message, 'toast-top-right');
}
else {
displayAlert('danger', 'warning', response.message, '#result');
}
}
});