在开始之前你需要知道:

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 = ,
Error =
} // 错误级别
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; }
public 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();
}

下面开始举一个栗子

模型

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 = ,
Age = ,
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给前端显示(这里可以绑定模型验证)

.net core 返回业务错误(不抛异常)的更多相关文章

  1. Ext JS 5 关于Store load返回json错误信息或异常的处理

    关于在store load的时候服务器返回错误信息或服务器出错的处理.ExtJS4应该也能用,没测试过. 这里有两种情况: 服务器返回错误json错误信息,状态为200 服务器异常,状态为500 一. ...

  2. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”

    在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...

  3. .net core 抛异常对性能影响的求证之路

    一.前言 在.net 社区中曾经听到过很多关于大量抛异常会影响性能这样的结论,心中一直就存在各种疑问.项目中使用自定义异常来处理业务很爽,但是又担心大量抛业务异常存在性能问题. 查阅了各种文档,微软官 ...

  4. 窥探Swift编程之错误处理与异常抛出

    在Swift 2.0版本中,Swift语言对其错误处理进行了新的设计,当然了,重新设计后的结果使得该错误处理系统用起来更爽.今天博客的主题就是系统的搞一下Swift中的错误处理,以及看一下Swift中 ...

  5. 记一次asp.net core 在iis上运行抛出502.5错误

    asp.net core 在iis上运行抛出502.5异常的部分原因以及解决方案 环境说明 已安装 .net core runtime 2.1.401 已安装 .net core windows ho ...

  6. 扩展方法where方法查询不到数据,不会抛异常,也不是返回的null

    如题,“扩展方法where方法查询不到数据,不会抛异常,也不是返回的null”,示例代码如下: Product类: public class Product { private string name ...

  7. OpenJDK源码研究笔记(一)-参数检查&抛出带关键错误提示信息的异常

    OpenJDK源码研究笔记系列文章,是我在阅读OpenJDK7源码的过程中的一些体会.收获.看法. 把研究过程中的成长和收获一点点地整理出来,是对自己研究学习的一个小结,也有可能给学习Java的一些同 ...

  8. java通过抛异常来返回提示信息

    结论:如果把通过抛异常的方式得到提示信息,可以使用java.lang.Throwable中的构造函数: public Throwable(String message) { fillInStackTr ...

  9. ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...

随机推荐

  1. DB_LINK删除

    由于业务需求,对测试库数据进行模糊化.为保生产数据安全,先删db_link; 1.共有db_link删除: select 'drop public database link '||db_link|| ...

  2. Spring 自动装配机制

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w ...

  3. 【BZOJ4173】数学 题解(数论)

    前言:体验到了推式子的快感orz 题目大意:求$\varphi(n)*\varphi(m)*\sum_{n\ mod\ k+m\ mod\ k\geq k} \varphi(k)\ mod\ 9982 ...

  4. Qt 中十六进制字节流转换为Base64编码

    在Qt中,在网络通信时,有时需要将16进制字节流转换为Base64编码传输,在Qt的QByteArray类中,提供了与Base64转换的接口: //16进制字节流转为Base64 QByteArray ...

  5. 028_go语言中的超时处理

    代码演示 package main import "fmt" import "time" func main() { c1 := make(chan strin ...

  6. aria2使用ajax调用/页面浏览器RPC调用aria2

    @ 目录 1. aria2使用ajax调用/页面浏览器RPC调用aria2 1.1. 总结: 1.2. ajax调用aria2-Demo 1.3. postMan命令测试 1.3.1. post基本使 ...

  7. Python初学者的自我修养,找到自己的方向

    今天是 Python专题 的第22篇文章,原本今天是准备和大家继续Python当中多线程的使用的相关内容.然而前两天有一个读者在后台问我,学习Python有哪些适合新手入门的小项目推荐,所以今天这篇临 ...

  8. HTTP POST 请求的两种编码格式:application/x-www-form-urlencoded 和 multipart/form-data

    在常见业务开发中,POST 请求常常在这些地方使用:前端表单提交时.调用接口代码时和使用 Postman 测试接口时.我们下面来一一了解: 一.前端表单提交时 application/x-www-fo ...

  9. 【Canal】数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!

    写在前面 在当今互联网行业,尤其是现在分布式.微服务开发环境下,为了提高搜索效率,以及搜索的精准度,会大量使用Redis.Memcached等NoSQL数据库,也会使用大量的Solr.Elastics ...

  10. SpringBoot实现本地存储文件上传及提供HTTP访问服务

    笔者计划为大家介绍分布式文件系统,用于存储应用的图片.word.excel.pdf等文件.在开始介绍分布式文件系统之前,为大家介绍一下使用本机存储来存放文件资源. 二者的核心实现过程是一样的: 上传文 ...