.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