優點:
可以統一處理所有頁面的異常,對所有需要返回json數據的異常,都用同樣的方法throw new DVMException()。頁面展示,controller的錯誤處理方式一樣
節省編碼時間,不用針對每一個controller編寫錯誤json
throw new DVMException()可以不僅出現在調用層級更深的其他方法中
編碼格式統一
自定義Exception:
/// <summary>
/// NewCRM異常
/// </summary>
public class DVMException : Exception
{
/// <summary>
/// 操作結果
/// </summary>
public OPResult Result { get; set; }
/// <summary>
/// 構造函數
/// </summary>
/// <param name="opr">操作結果</param>
/// <param name="message">消息內容</param>
public DVMException(OPResult opr, String message)
: base(message)
{
Result = opr;
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="opr">返回代碼</param>
/// <param name="message">錯誤消息</param>
/// <param name="e">原始異常</param>
public DVMException(OPResult opr, String message, Exception e)
: base(message, e)
{
Result = opr;
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="message">消息內容</param>
/// <param name="e">異常棧</param>
public DVMException(String message, Exception e)
: base(message, e)
{
Result = OPResult.ServerError;
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="e">異常堆棧</param>
public DVMException(Exception e)
: base("Server Operation Failed", e)
{
Result = OPResult.ServerError;
}
}
/// <summary>
/// 操作結果
/// </summary>
public class DVMOPResult
{
/// <summary>
/// 操作是否成功
/// </summary>
public Boolean OPSucess { get; set; }
/// <summary>
/// 結果代碼
/// </summary>
public OPResult OPCode { get; set; }
/// <summary>
/// 操作結果,類型可變,由Type進行判斷
/// </summary>
public Object ResultContent { get; set; }
/// <summary>
/// 返回類型名稱
/// </summary>
public String Type { get; set; }
/// <summary>
/// 返回是否為數組
/// </summary>
public Boolean IsArray { get; set; }
}
public class HandleJsonExceptionAttribute:HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
var logger = IocFactory.Instance.GetInstance<ILogBase>();
var exception = filterContext.Exception;
var url = filterContext.HttpContext.Request.RawUrl;
String message = exception.Message;
logger.Error(String.Format("Request error on url {0}: {1}", url, message), exception);
JsonResult jsonResult = new JsonResult() { MaxJsonLength = Int32.MaxValue };
jsonResult.Data = message;
filterContext.Result = jsonResult;
filterContext.ExceptionHandled = true;
}
}
controller中使用:[HandleJsonException]
[HttpPost]
[HandleJsonException]
public ActionResult Save(SaveAccountRequest request)
{
var accountDTO = request as AccountDTO;
FixRatePost(ref accountDTO);
request.UserId = this.CurrentUser.UserId;
var id =_accountService.SaveAccount(request);
if (id < 0)
{
throw new DVMException(OPResult.ServerError, "此賬戶已存在並啟用,無法重復創建");
}
return new JsonResult { Data = true };
}
View展示異常:ajax的error處理
postCreation: function (successMessage) {
$.ajax({
data: $("form").serialize(),
url: "@Url.Content("~/Account/Save")",
type: 'POST',
dataType: 'json',
cache: false,
success: function (data) {
if (data.toString() == "true") {
$.Dialog({
overlay: true,
shadow: true,
flat: false,
icon: '',
width: 330,
content: '<div class="" style="text-align:left;padding:10px;font-size:16px;">' + successMessage + '</div>'
+ '<div class="size4 text-right">'
+ '<button class="warning" id="comfirm"><i class="icon-checkmark on-left"></i>關閉</button> '
+ '</div>',
overlayClickClose: false,
onShow: function (_dialog) {
$("#comfirm", $(_dialog)).click(function () {
//保存成功返回列表頁
$("#cancel").click();
})
}
});
} else {
showAlert(data);
};
freezeButton(false);
},
error: function (data) {
showAlert(data);
freezeButton(false);
}
});
}
