1. 程式人生 > 實用技巧 >.net core 返回業務錯誤(不拋異常)

.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給前端顯示(這裡可以繫結模型驗證)