系统异常设计规范与原则
为什么80%的码农都做不了架构师?>>>
1.系统异常设计的出发点:
- 良好的异常信息展示,开发运维人员能快速定位问题。
- 响应外部调用异常时,应能明确指明是内部异常还是调用条件不满足导至。
- 响应用户操作异常时,能友好的提示用户。
如何做到以上3点?
1.1 首先我们需要对异常进行分类。
- 内部异常
- 资源环境导致(系统环境异常、数据库连接超时、第三方服务响应超时)
- 第三方服务错误响应
- 第三方响应结果错误
- 外部传入参数非法
- 错误的编码逻辑
- 错误的配置
- 异常的业务数据(业务数据缺失)
- 业务异常
- 用户操作错误
- 业务条件不满足
1.2 其次需要在系统中正确的捕获这类异常,并抛出。
- 方法入参进行合法性验证。
- 对系统外部提供的接口,是必须要进行参数验证(必须)
- 系统内部对外外层提供接口,进行验证
- 工具类进行参数验证
- public 方法要进行验证
- private 方法(不建议参数验证)
- 第三方响应结果合法性验证。
- 获取第三方法结果后,根据你们的约定进行验证。
- 业务处理前,对业务业务前置条件进行验证。
- 业务处理前,验证业务条件(验证佘额、验证这个帐户有没有被公安门锁定)
- 要考虑性能成本(验证身份证号码是不是存在的)
- 业务处理后,对处理结果进行验证。
- 验证对方帐户是不是到帐了,转出帐户是不是成功扣款
- 对于可能会出现异常的代码进行 try catch 捕获。
- 尝试恢复处理
- 直接抛出
- 转换后抛出
1.3 最后 在系统出口统一拦截处理。
统一拦截的目的是确保出去的异常是可控的, 调用方能够明白的异常信息。
这里出口是指系统对外统一响应逻辑,一般我们可分三类场景
- WEB Response
- 内部异常:引导至异常提示页。
- 业务异常:返回对应提示消息至前端。
- 未知异常:尝试进行认别,如果认识不了,转换成 编码异常(BUG)。
- Http API 接口响应
- 内部异常:返回接口不可用消息。
- 参数错误:基于API文档中的异常列表进行进行响应返回。表明参数非法,需要调用方加强参数合法性验证
- 业务错误:基于掊口约定反回对应code与消息。
- RPC Service 响应
- 内部异常:返回服务不可用消息
- 参数错误:基于接口文档进行响应,直接返回异常堆栈。
- 业务错误 :直接返回异常堆栈。
2.checkedException 与uncheckedException 声明原则
- 如果是参数非法抛出,返回结果非法(即软件BUG) uncheckedException
- 如果你认为调用方程序员需要有意识地采取措施,那么抛出检查型异常。
- 程序产品有明确的条件约束的要求,可声明检测型业务异常
3.总结异常设计与处理原则
3.1 异常的定义技巧
- 基于分包表示异常的分类,不建议使用继承
- 如果继承并不能直观的知道此异常为什么类型
- 业务异常可以新建包serviceexception
- 系统异常可以新建包systemexception
- 创建异常来类定义业务异常,不建议使用Code来定义
- 建议使用枚举类型
- 使用枚举来表示业务异常的几种结果,不建议使用code
3.2 统一对异常进行分类处理
- 异常转换
- 异常信息处理
- 逻辑断言
- 参数合法性验证
- 返回结果合法性验证
3.3 异常捕获
3.31 统一对异常进行拦截处理
目的:防止不明确的异常流出系统
- RPC Service 响应拦截
- Web Control 响应拦截
- Http API 响应拦截
4.常见错误异常处理方式
直接勿略异常(不推荐):
try { new String(source.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
正确的处理(推荐):
try { new String(source.getBytes("UTF-8"), "GBK"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("环境不支持UTF-8",e) }
业务异不提供任何信息
public class DuplicateUsernameException extends Exception { }
给每个异常处理都定义一个Code
用一个统一异常替代所有业务异常(不推荐)
public class ServiceException extends RuntimeException { public ServiceException(Exception e) { super(e); } public ServiceException(String message) { super(message); } }
错误:1 、必须明确定义业务异常 2、 尽可能申明成checkedException 3要带上具体的业务数
正确方式:定义明确的业务异常
转载于:https://my.oschina.net/muyuxi/blog/1608425
系统异常设计规范与原则相关推荐
- 系统架构师-基础到企业应用架构-系统设计规范与原则[上篇]
一.上章回顾 在上篇中我们讲解了几类UML2.0语言新推出的建模图形,总体来说通过这些图形能更详细的将某类信息表达出来.在这里我们简单回顾上篇讲解的内容. 上图中已经简单介绍了上章讲述的内容,具体内容 ...
- 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析
参考文献: 1.<[野火®]uCOS-III 内核实现与应用开发实战指南-基于STM32 >: 2.CM3 权威指南CnR2(电子版)/Cortex-M3 权威指南 Joseph Yiu ...
- MYSQL数据库设计规范与原则
有远大抱负的人不可忽略眼前的工作!!! MYSQL数据库设计规范与原则 MYSQL数据库设计规范 1.数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; ...
- 强烈推荐|我做系统架构的一些原则
本文已授权自骨灰级技术专家陈皓 原文:https://coolshell.cn/articles/21672.html 读完受益匪浅,强烈推荐给大家,都是非常宝贵的经验,希望大家也有收获! 工作 20 ...
- linux权限最小化分级,vim可视化Linux系统安全最小化原则 su sudo
一.vim在可视化模式下编辑 crl+v,会变成-- VISUAL BLOCK --,然后用上下左右键去选中. 多行注释: ESC进入命令行模式; Ctrl+v进入VISUAL BLOCK模式 上下左 ...
- 心理正常与异常的区分_心理正常与心理异常区分三原则
#老周聊心理# 心理正常与心理异常 区分的三原则 人的心理健康状况可划分为心理正常与心理异常两个大的范畴,就是通常我们说的没病或有病.心理正常范筹内按心理健康程度的不同又可分为心理健康与心理不健康两大 ...
- 滴滴回应上班高峰期大范围崩溃 :系统异常 订单差额部分统一退还
今日早间,全国多地网友反映,早高峰的时候滴滴软件打不了车.发布了行程也看不见.取消不了订单等多种异常情况,"滴滴崩了"的话题还登上微博热搜. 对此,滴滴方面回应称,由于系统异常,今 ...
- 获得系统异常的详细信息
在.net中有一个非常重要的namespace System.Diagnostics,在这个namespace中我们可以与系统进程.事件日志和性能计数器进行交互(MSDN). 在他的下 ...
- Oracle预定义的21个系统异常类型
Oracle预定义的21个系统异常类型 参考文章: (1)Oracle预定义的21个系统异常类型 (2)https://www.cnblogs.com/lonelywolfmoutain/p/4234 ...
最新文章
- 灰度图像--图像分割 Scharr算子
- pandas明明数据有,但是通过该标签进行筛选的时候就得到空或者是错误的结果
- [Leedcode][JAVA][第542题][01矩阵][BFS]
- php中的active,用ActivePHP打造版本管理系统
- 全球数据库--基金/管理产品--分类/行业平均
- SpringBoot和RabbitMQ集成
- 12001.linux应用程序之i2c编程
- java 图片旋转裁剪_【Java实例】使用Thumbnailator生成缩略图(缩放、旋转、裁剪、水印)...
- [Java]图书管理系统
- C语言编程题:(C语言)分糖果 通俗易懂
- 税务计算机类考试题型,税务师考试题型分值分配、计算器要求及2020年考试时间...
- 18年6月英语六级第一套听力单词
- 恒星播放器 for Mac(万能视频播放器)
- 读书笔记之稻盛和夫自传
- webgl1到webgl2_我如何使用WebGL重建Gorillaz Andromeda音乐视频
- 用for循环语句改写程序,写五行笑脸“今天很开心:)
- Adobe Acrobat Pro DC 缩小文件大小
- 接口性能测试方案 白皮书 V1.0
- 1s内能执行多少次for循环
- 2022起重机司机(限桥式起重机)特种作业证考试题库及在线模拟考试