.net core 返回業務錯誤(不拋異常)
阿新 • • 發佈:2020-09-15
在開始之前你需要知道:
1、通過拋異常--全域性捕獲異常的方式返回業務錯誤資訊效能是非常差的(不知道為什麼的可以百度一下)
2、如何將錯誤資訊繫結到mvc模型驗證中
自定義返回內容
//返回內容介面 public interface IBusinessCodeStatus { // 業務狀態碼 public BusinessCode Code { get; set; } // 資訊 public string Message { get; set; } // 錯誤級別 public ErrorLevel Level { getView Code; set; } // 錯誤型別 public ErrorCategory Category { get; set; } } //業務程式碼 public enum BusinessCode { Success = 200, Error = 400 } // 錯誤級別 public enum ErrorLevel { // 系統級 System, // 業務級 Business } // 錯誤型別 public enum ErrorCategory {// 空物件 EmptyObject, // 通用 Currency }
在這裡我用結構體去包裝返回的業務狀態
為什麼要用結構體?
因為結構體儲存在棧中,在方法執行完後就會自動釋放
如果是物件則會放在託管堆上,最後由GC去釋放
public struct BusinessCodeStatus : IBusinessCodeStatus { public BusinessCode Code { get; set; } public string Message { get; set; }View Codepublic ErrorLevel Level { get; set; } public ErrorCategory Category { get; set; } public static readonly BusinessCodeStatus Success = new BusinessCodeStatus();//返回成功資訊 }
定義Dto的模型基類
// 模型基類 public class BaseResult { // 業務狀態 public BusinessCodeStatus ZCodeStatus { get; set; } = BusinessCodeStatus.Success; public void BadResult(string message, ErrorCategory category, ErrorLevel level = ErrorLevel.Business, BusinessCode code = BusinessCode.Error) { ZCodeStatus = new BusinessCodeStatus { Category = category, Message = message, Code = code, Level = level }; } public void BadResult(string message) { ZCodeStatus = new BusinessCodeStatus { Message = message, }; } public static readonly BaseResult Success = new BaseResult(); }View Code
下面開始舉一個栗子
模型
public class DtoUser : BaseResult { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; } }
業務層
public class UserBll { public DtoUser GetUser_Error() { var user = new DtoUser(); user.BadResult("業務出錯了!!!!"); //這個地方處理不太優雅
//當時想模仿IActionResult做成介面,但是這樣子就會高度定製化
//就會導致影響編碼習慣
//所以在這裡我就捨棄了優雅 ^_^
return user; } //成功返回結果 public DtoUser GetUser_Success() { //一系列的業務處理之後得到結果 return new DtoUser { Id = 1, Age = 18, Name = "張三", Sex = "男" }; ; } }
控制器層
[Route("values")] [ApiController] public class ValuesController : ControllerBase { private readonly UserBll _userBll; public ValuesController() { _userBll = new UserBll(); } [HttpGet("success")] public string GetResult_Success() { var model = _userBll.GetUser_Success(); return "成功"; } [HttpGet] public string GetResult_Error() { var model = _userBll.GetUser_Error(); if (model.ZCodeStatus.Code == BusinessCode.Error) return model.ZCodeStatus.Message; return "成功"; } }
這樣子就可以將業務層的錯誤資訊拋至介面層
然後定製化400給前端顯示(這裡可以繫結模型驗證)