系统中异常公共处理模块 in spring boot
最近在用spring boot 做微服务,所以对于异常信息的 【友好展示】有要求,我设计了两点:
一、 在业务逻辑代码中,异常的抛出 我做了限定,一般只会是三种:
1. OmcException //自己写的异常包装类 ,主要用来处理业务异常
2. IllegalArgumentException //参数异常类,其实这个可以不要,只是在我的系统中,我想把参数异常和业务异常做区分
3. 其他的异常,都按Exception抛 //因为它的抽象层次最高,所以在系统中按优先级最低进行处理,除非必要(如容器级错误)否则尽量避免
OmcException的构造是这样的:

这里留个钩子:
为什么要在抛异常时,带上 日志的信息 + 输入参数的信息?
—— 因为,我希望在业务逻辑代码中,对于这些异常的处理,最好就是一行代码,类似于:打印error日志 + 向用户返回友好的错误信息。我想做一个公共的处理模块。让业务逻辑代码尽可能的清爽一些。
对异常的进行try-catch包装的过程是:

对异常的抛出做限定,给个总结就是:尽量包装成我们自己封装的异常包装类。
为什么呢? 这是在设计上做限定,那么后进的程序员,如果不按照这个规范走,功能是做不出来的。这个也是架构设计的意义,不要随便动个嘴就好,还要把栅栏建好。
二、 在公共的业务逻辑处理代码中,异常的接收(或者说异常的路由) 我做了限定,一般是:
1. 先匹配业务异常。业务异常一般向用户提示什么呢? 错误编码 + 错误提示信息。
2. 其次,匹配参数异常,这些参数异常可能是我们自己做参数校验抛出来的,也有可能是spring mvc 抛出来的,所以还没有到我们的业务逻辑代码中。
参数异常一般提示什么呢? 错误提示信息(包含哪个字段出现了错误)
3. 根异常Exception,这里捕获的异常,可能是我们不愿意处理的 数据库异常,也有可能是容器报的异常(当然,这些异常我们并不能捕获所有的。)这里要做打error日志的处理。
一个设计良好的系统,最好是不要走进这个分支,毕竟分析error日志不是一件多么光荣的事儿。
spring boot中,公共异常处理模块代码结构是:



然后是,打印error日志 + 向用户返回友好的错误信息

系统中异常公共处理模块 in spring boot的更多相关文章
- 如果你的application.properties中还存在明文密码----加密Spring Boot中的application.properties
1 概述 什么?都2020年了还在Spring Boot的配置文件中写明文密码? 虽然是小项目,明文也没人看. 明文简单快捷方便啊!!! 你看直接用户名root密码123456多么简单!!! ... ...
- Spring Boot(三):Spring Boot中的事件的使用 与Spring Boot启动流程(Event 事件 和 Listeners监听器)
前言:在讲述内容之前 希望大家对设计模式有所了解 即使你学会了本片的内容 也不知道什么时候去使用 或者为什么要这样去用 观察者模式: 观察者模式是一种对象行为模式.它定义对象间的一种一对多的依赖关系, ...
- 使用IDEA 中 实现springboot 热部署 (spring boot devtools版)
第一步:添加springboot的配置文件 首先我先贴出我的配置 添加依赖包 <!-- spring boot devtools 依赖包. --> <dependency> & ...
- (5)全局异常捕捉【从零开始学Spring Boot】
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
- 利用 Maven 构造 Spring Cloud 微服务架构 模块使用 spring Boot构建
采用Maven 聚合工程搭建 Spring Cloud 使用工具: IntelliJ IDEA 版本: 2019.2.2 maven 版本: 3.6.0 JDK ...
- spring boot:构建多模块项目(spring boot 2.3.1)
一,为什么要使用多模块? 1,结构更清晰,方便管理 如果只是一个小项目当然没有问题, 但如果功能越增越多则管理越来越复杂, 多模块可以使项目中模块间的结构分离 2,把项目划分成多 ...
- spring boot:使用validator做接口的参数、表单、类中多字段的参数验证(spring boot 2.3.1)
一,为什么要做参数验证? 永远不要相信我们在后端接收到的数据, 1,防止别人通过接口乱刷服务:有些不怀好意的人或机构会乱刷我们的服务,例如:短信接口, 相信大家可能很多人在工作中遇到过这种情况 2,防 ...
- Java中设置Session过期时间(Spring Boot)
1.Spring Boot: server.session.cookie.comment = #注释会话cookie. server.session.cookie.domain = #会话cookie ...
- 5.全局异常捕捉【从零开始学Spring Boot】
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
随机推荐
- Jmeter性能测试入门(转)
出处:http://www.cnblogs.com/by-dream/p/5611555.html Jmeter性能测试步骤 1. 添加线程组之后,先设置这两项: 2. 添加一个http请求 被测的u ...
- 正则匹配中文 UTF-8 & GBK
在php 中: //GB2312汉字字母数字下划线正则表达式 GBK: preg_match("/^[".chr(0xa1)."-".chr(0xff).&qu ...
- Linux学习 : 裸板调试 之 配置UART
1.UART原理说明 发送数据时,CPU将并行数据写入UART,UART按照一定的格式在一根电线上串行发出:接收数据时,UART检测另一根电线上的信号,串行收集然后放在缓冲区中,CPU即可读取UART ...
- leetcode 日记 162. Find Peak Element java python
根据题目可知,输入为:一个相邻元素不相等的数列,输出为:其中一个(上)峰值的序号.并且要求时间复杂度为logn 分析:由于题目要求时间复杂度为logn,因此不能进行全部遍历.又因为只需要找到其中的一个 ...
- Java泛型学习笔记 - (二)泛型类
1. 我们先写一个没有泛型的类Box: public class Box { private Object obj; public Box() {} public Object getObj() { ...
- js操作dom---创建一个域来输出调试信息
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- 《SharePoint 2013 应用开发实战》目录
博客地址:http://blog.csdn.net/FoxDave 第 1 章 1 ◄SharePoint概述► 1 1.1 SharePoint的发展历程 1 1.1.1 Sha ...
- 【转】 Linux shell的&&和||
http://www.2cto.com/os/201302/189655.html Linux shell的&&和|| shell 在执行某个命令的时候,会返回一个返回值,该返回值 ...
- mvc 导入,导出excel
最近主要做导入excel 在网上查询了代码 public FileResult DownLoadExcelJiZuChaXunGenRenXiaoFeiJiLu() { DataTable dt = ...
- 位置指纹(LF)定位技术简介-室内定位
信号的多径传播对环境具有依赖性,呈现出非常强的特殊性.对于每个位置而言,该位置上信道的多径结构是惟一的,终端发射的无线电渡经过反射和折射,产生与周围环境密切相关的特定模式的多径信号,这样的多径 ...