在开始之前你需要知道:

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. 省选模拟赛day4

    怎么说?发现自己越来越菜了 到了不写题解写不出来题目的地步了.. 这次题目我都有认真思考 尽管思考的时候状态不太好 但是 我想 再多给我时间也思考不出来什么吧 所以写一份题解. T1 n个点的有根树 ...

  2. HashMap源码(数组算法)

    Jdk1.8初始化hashMap容量的算法 static final int tableSizeFor(int cap) { // 先减1,避免传进来的本来就是2的n次幂,导致算出来多了一次幂,比如传 ...

  3. 正确的使用HttpClient

    快捷的网络请求,多用HttpClient 但是常规的写法会一大片的TIME_OUT 比如这样的例子 static async Task<string> TestHttpClient(str ...

  4. Android ExpandListView的用法(补上昨天的)(今天自习)

    今天自习写ExpandListView的作业,昨天没写博客就是去写作业去了. 今天来说昨天内容吧! 其实ExpandListView和ListView的用法大同小异. 首先就是创建一个自己的适配器(现 ...

  5. Meow 攻击会删除不安全(开放的)的Elasticsearch(及MongoDB) 索引,然后建一堆以Meow结尾的奇奇怪怪的索引(如:m3egspncll-meow)

    07月29日,早上照例一来,先连接Elasticsearch查看日志[禁止转载,by @CoderBaby],结果,咦,什么情况,相关索引被删除了,产生了一堆以Meow开头的奇奇怪怪的索引,如下图: ...

  6. Python使用Tornado+Redis维护ADSL拨号服务器代理池

    们尝试维护过一个免费的代理池,但是代理池效果用过就知道了,毕竟里面有大量免费代理,虽然这些代理是可用的,但是既然我们能刷到这个免费代理,别人也能呀,所以就导致这个代理同时被很多人使用来抓取网站,所以当 ...

  7. 5、Java 修饰符

    引言:Java的修饰符根据修饰的对象不同,分为类修饰符.方法修饰符.变量修饰符,其中每种修饰符又分为访问控制修饰符和非访问控制修饰符. 1.访问控制修饰符的总结 四个关键字:public.protec ...

  8. Java 多态 接口继承等学习笔记

    Super关键字 1.子类可以调用父类声明的构造方法 : 语法:在子类的构造方法中使用super关键字  super(参数列表) 2.操作被隐藏的成员变量(子类的成员变量和父类的成员变量重名的说法)和 ...

  9. MySQL连接查询、子查询与联合查询

    一 连接查询 1.交叉连接: 语法: from  表1  [cross]  join  表2  ; 例如: 表一: 表2: 交叉: 交叉查询并没有意义. 2.内连接: 语法: from  表1  [i ...

  10. 学习java的第五周

    java流程控制 顺序结构 语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执的处理步骤组成的,它是任何-一个算法都离不开的一种基本算法结构. 选择结构 if结构 if(布尔表达式 ...