.net core 返回業務錯誤(不拋異常)


在開始之前你需要知道:

1、通過拋異常--全局捕獲異常的方式返回業務錯誤信息性能是非常差的(不知道為什么的可以百度一下)

2、如何將錯誤信息綁定到mvc模型驗證中

自定義返回內容

 //返回內容接口
public interface IBusinessCodeStatus
  {
        // 業務狀態碼
        public BusinessCode Code { get; set; }

        // 信息
        public string Message { get; set; }

        // 錯誤級別
        public ErrorLevel Level { get; set; }

        // 錯誤類型
        public ErrorCategory Category { get; set; }
  }

//業務代碼
 public enum BusinessCode
 {
        Success = 200,
        Error = 400
 }

 // 錯誤級別
 public enum ErrorLevel
 {
        // 系統級
        System,
        // 業務級
        Business
 }

 // 錯誤類型
 public enum ErrorCategory
 {
        // 空對象
        EmptyObject,
        // 通用
        Currency
}
View Code

在這里我用結構體去包裝返回的業務狀態

為什么要用結構體?

因為結構體保存在棧中,在方法執行完后就會自動釋放

如果是對象則會放在托管堆上,最后由GC去釋放

public struct BusinessCodeStatus : IBusinessCodeStatus
{
        public BusinessCode Code { get; set; }
        public string Message { get; set; }
        public ErrorLevel Level { get; set; }
        public ErrorCategory Category { get; set; }

        public static readonly BusinessCodeStatus Success = new BusinessCodeStatus();//返回成功信息
}
View Code

定義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給前端顯示(這里可以綁定模型驗證)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM