系统中异常公共处理模块 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 ...
随机推荐
- iOS开发_内存泄漏、内存溢出和野指针之间的区别
今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正. 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自 ...
- widows下node.js环境搭建及运行js
昨天刚刚开始学习node.js,网上一些教程不是很清楚,所以总结一下我的经验. 1.安装. 安装省略,就到官网上去下载安装一下就好.安装完成之后,打开cmd,输入"path",查看 ...
- Python Day04
一.迭代器与生成器: 迭代器(iterator): 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,迭代器的一大优点是不要求事 ...
- StormNimbus集群保证CAP流程
Nimbus启动时,检查当前本地是不是有所有的topology的代码,同时去申请获取leader锁,如果某台nimbus节点成为了集群的leader,会再去检查一次当前本地的代码是不是包含所有活动状态 ...
- 初学3D Touch
引言 With iOS 9, new iPhone models add a third dimension to the user interface. A user can now press y ...
- React Native 一个组件styles BUG
'use strict'; var React = require('react-native'); var { StyleSheet, PanResponder, View, Text } = Re ...
- C#实现Excel的导入导出
Excel作为日常使用工具,在开发过程中经常会用到其导入导出功能.经过一个小的练习,学习了下导入导出功能. 导出篇: 从数据库查询到所要导出的数据,以xml的形势保存下来,最后输出excel的格式,保 ...
- Java Json Object 互转
官方网址: http://json-lib.sourceforge.net/ 需要准备的jar包 1. json-lib-2.4-jdk15.jar 目前最新版, 下载地址 http: ...
- 一些Layout的坑
iOS这个东西,初学感觉,还好还好,然后一年之后再来修复一下初学的时候的代码,我只是感觉头很晕- - 别扶我. AutoLayout的坑,明明以前都没有的!!!升了iOS10就突然发现了这个坑,其实也 ...
- Spark源码学习1.2——TaskSchedulerImpl.scala
许久没有写博客了,没有太多时间,最近陆续将Spark源码的一些阅读笔记传上,接下来要修改Spark源码了. 这个类继承于TaskScheduler类,重载了TaskScheduler中的大部分方法,是 ...