当前位置: 首页 > 编程日记 > 正文

系统异常设计规范与原则

为什么80%的码农都做不了架构师?>>>   hot3.png

1.系统异常设计的出发点:

  1. 良好的异常信息展示,开发运维人员能快速定位问题。
  2. 响应外部调用异常时,应能明确指明是内部异常还是调用条件不满足导至。
  3. 响应用户操作异常时,能友好的提示用户。

如何做到以上3点?

1.1 首先我们需要对异常进行分类。

  1. 内部异常
    1. 资源环境导致(系统环境异常、数据库连接超时、第三方服务响应超时)
    2. 第三方服务错误响应
    3. 第三方响应结果错误
    4. 外部传入参数非法
    5. 错误的编码逻辑
    6. 错误的配置
    7. 异常的业务数据(业务数据缺失)
  2. 业务异常
    1. 用户操作错误
    2. 业务条件不满足

1.2 其次需要在系统中正确的捕获这类异常,并抛出。

  1. 方法入参进行合法性验证。
    1. 对系统外部提供的接口,是必须要进行参数验证(必须)
    2. 系统内部对外外层提供接口,进行验证
    3. 工具类进行参数验证
    4. public 方法要进行验证
    5. private 方法(不建议参数验证)
  2. 第三方响应结果合法性验证。
    1. 获取第三方法结果后,根据你们的约定进行验证。
  3. 业务处理前,对业务业务前置条件进行验证。
    1. 业务处理前,验证业务条件(验证佘额、验证这个帐户有没有被公安门锁定)
    2. 要考虑性能成本(验证身份证号码是不是存在的)
  4. 业务处理后,对处理结果进行验证。
    1. 验证对方帐户是不是到帐了,转出帐户是不是成功扣款
  5. 对于可能会出现异常的代码进行 try catch 捕获。
    1. 尝试恢复处理
    2. 直接抛出
    3. 转换后抛出

1.3 最后 在系统出口统一拦截处理。

统一拦截的目的是确保出去的异常是可控的, 调用方能够明白的异常信息。

这里出口是指系统对外统一响应逻辑,一般我们可分三类场景

  1. WEB Response
    1. 内部异常:引导至异常提示页。
    2. 业务异常:返回对应提示消息至前端。
    3. 未知异常:尝试进行认别,如果认识不了,转换成 编码异常(BUG)。
  2. Http API 接口响应
    1. 内部异常:返回接口不可用消息。
    2. 参数错误:基于API文档中的异常列表进行进行响应返回。表明参数非法,需要调用方加强参数合法性验证
    3. 业务错误:基于掊口约定反回对应code与消息。
  3. RPC Service 响应
    1. 内部异常:返回服务不可用消息
    2. 参数错误:基于接口文档进行响应,直接返回异常堆栈。
    3. 业务错误 :直接返回异常堆栈。

2.checkedException 与uncheckedException 声明原则

  1. 如果是参数非法抛出,返回结果非法(即软件BUG) uncheckedException
  2. 如果你认为调用方程序员需要有意识地采取措施,那么抛出检查型异常。
  3. 程序产品有明确的条件约束的要求,可声明检测型业务异常

3.总结异常设计与处理原则

3.1 异常的定义技巧

  1. 基于分包表示异常的分类,不建议使用继承
    1. 如果继承并不能直观的知道此异常为什么类型
    2. 业务异常可以新建包serviceexception
    3. 系统异常可以新建包systemexception
  2. 创建异常来类定义业务异常,不建议使用Code来定义
    1. 建议使用枚举类型
  3. 使用枚举来表示业务异常的几种结果,不建议使用code

3.2 统一对异常进行分类处理

  • 异常转换
  • 异常信息处理
  • 逻辑断言
  • 参数合法性验证
  • 返回结果合法性验证

3.3 异常捕获

3.31 统一对异常进行拦截处理

目的:防止不明确的异常流出系统

  1. RPC Service 响应拦截
  2. Web Control 响应拦截
  3. 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

相关文章:

陈长沙:学习者参考手册

学习者参考手册 组队学习的核心是“和一群有意思的人在一起学感兴趣的知识的过程,这个过程充满了人与人之间的交流互动,是融入社交属性和学习属性的过程”。作为参与组队学习活动的学习者,一定想了解有关该项活动的各种环节。于是&#xff0…

TC配置文件WCMD.INI详解,只能在ini重修改的配置

有*的项目扩展了功能,有★的项目是只能在INI中修改的配置。 ★Allowed 允许访问哪些驱动器(\代表网络邻居)。例如写为Allowedcde\,代表仅允许访问C、D、E和网络邻居,其余驱动器无法访问,也不会出现在驱动…

mapgis矢量化怎么打分数_mapgis矢量化的详细工作流程

感觉不错就麻烦评下分哦1、准备光栅文件,启动MAPGIS输入编辑子系统,新建工程、新建控制点、界址点、线层等项目文件,建立界址点文件和线层文件的属性结构;2、采集控制点,记录图幅左下角经纬度,保存项目、工…

AutoFac使用方法总结:Part I

utoFac是.net平台下的IOC容器产品,它可以管理类之间的复杂的依赖关系。在使用方面主要是register和resolve两类操作。 这篇文章用单元测试的形式列举了AutoFac的常用使用方法: 注册部分 使用RegisterType进行注册 [Fact]public void can_resolve_myclass…

canvas烟花锦集

canvas可以实现不同动画效果&#xff0c;本文主要记录几种不同节日烟花效果实现。 原文链接 实现一 效果地址 html <canvas id"canvas"></canvas>css body {background: #000;margin: 0; }canvas {cursor: crosshair;display: block; }js // when animat…

【青少年编程(第29周)】8月份的青少年编程组队学习结营了!

2021年09月05日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第二十九次直播活动。我们直播活动的主要内容如下&#xff1a; 首先&#xff0c;我们奖励了上周测试超过60分的小朋友。 其次&#xff0c;我们一起观看了电子学会等级测试流程的视频。 再…

led伏安特性实验误差分析_检测实验室误差分析知识汇编

2019-12-20 09:56:10 来源: 检测实验室误差分析知识汇编-检测家第一部分 误差理论简介在日常检测工作中&#xff0c;我们虽然有最好的检验方法、有检定合格的仪器设备、有满足检验要求的环境条件和熟悉检验工作的操作人员&#xff0c;但是&#xff0c;得到的检验结果却往往不可…

从Qcheck 1.3 不能在不同操作系统上运行问题(chro124、chro342)说开来------

【本文重在技巧学习&#xff0c;授人以鱼&#xff0c;不如授人以渔&#xff01;&#xff01;&#xff01;】 因为公司项目需要对带宽占用进行测试&#xff0c; 最近看电子工业出版社《网络管理工具使用详解》就qcheck 1.3 不能在不同的操作系统之间运行做一个总结。 本文以标题…

Spark笔试

1.Spark 的四大组件下面哪个不是 (D ) A.Spark Streaming B Mlib C Graphx D Spark R 2.下面哪个端口不是 spark 自带服务的端口 (C ) A.8080 B.4040 C.8090 D.18080 3.spark 1.4 版本的最大变化 (B ) A spark sql Release 版本 B 引入 Spark R C DataFrame D支持动态资源…

秦州:西瓜书 + 南瓜书 吃瓜系列 10. 集成学习(下)

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 航路开辟者&#xff1a;谢文睿、秦州开源内容&#xff1a;https://githu…

iar定义arm版本_IAR Systems发布 IAR Embedded Workbench for ARM新版本

IAR Systems发布IAR Embedded Workbench for ARM嵌入式开发平台最新版本V5.41。相比于之前的版本&#xff0c;新版本软件在支持Cortex-M0上&#xff0c;将代码大小和执行速度这两个重要性能都提高了13%。本文引用地址&#xff1a;http://www.eepw.com.cn/article/106054.htmNXP…

UVA10110 Light, more light

链接地址。 分析&#xff1a; 如果n能被a整除&#xff0c;那么一定存在一个b使得a*b n。开关经两次变化相当于没有变化。那么只要看a b的那种特殊情况就OK了。 #include <stdio.h> #include <math.h> #include <stdlib.h>int main(){unsigned n, k;while(s…

【组队学习】【29期】Datawhale组队学习内容介绍

第29期 Datawhale 组队学习活动马上就要开始啦&#xff01; 本次组队学习的内容为&#xff1a; 编程实践&#xff08;数据可视化&#xff09;计算机视觉自然语言处理之情感分析吃瓜教程——西瓜书南瓜书李宏毅机器学习&#xff08;含深度学习&#xff09;动手学数据分析集成学…

json的简单的数据格式

json的简单数据格式 var arr{"obj1":["张三","12","女"],"obj2":["李四","12","女"],"obj3":["王五","12","女"],} var str""; $.each(a…

eplise怎么连接数据库_基于手机信令的大数据分析教程(一)数据导入数据库

前言该套教程以一个初学大数据的菜鸟视角&#xff0c;编写数据分析处理的整套流程。写得较为详(luo)细(suo)&#xff0c;希望适用于任何城乡规划大数据的初学者。持续更新中&#xff0c;若有错误&#xff0c;望指正&#xff01;1、任务总纲&#xff08;1&#xff09;职住数据导…

反序列化xml

我是.net 菜鸟。 今天学习一下反序列化xml&#xff0c;即将xml文件转换成程序更好识别的对象。 下面来看一个例子。这是一个xml文件。 <xml> <students> <student> <fields> <field value"name"><field> <field value"i…

【青少年编程】【三级】小鸡吃虫

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

Android拍照得到全尺寸图片并进行压缩/拍照或者图库选择 压缩后 图片 上传

http://www.jb51.net/article/77223.htm https://www.cnblogs.com/breeze1988/p/4019510.html

display会影响canvas吗_多动症会影响智商吗?

小智&#xff08;化名&#xff09;小的时候非常皮&#xff0c;上学了也不老实&#xff0c;学习成绩还很差&#xff0c;一直是倒数&#xff0c;还有人说他智商低。父母带他到医院检查&#xff0c;一切都正常&#xff0c;智商也没问题。直到最近他被检查出多动症&#xff0c;小智…

SQL Server 数据库清除日志的方法

方法一&#xff1a; 1、打开查询分析器&#xff0c;输入命令 BACKUP LOG database_name WITH NO_LOG 2、再打开企业管理器--右键要压缩的数据库--所有任务--收缩数据库--收缩文件--选择日志文件--在收缩方式里选择收缩至xxm,这里会给出一个允许收缩到的最小m数,直接输入这个数,…

Axure8.0 网页 or App 鼠标滚动效果

1、index 页下添加一个内联框架&#xff0c;设置好自己想要的尺寸。 2、右键点击该内联框架转换为动态面板&#xff0c;并取消勾选“自动调整为内容尺寸”。 3、双击 “内联框架”选择并双击“state1” 切换到“内联框架的state1”页面&#xff0c;将“内联框架”组件的滚动条设…

【组队学习】【29期】1. 编程实践(数据可视化)

1. 编程实践&#xff08;数据可视化&#xff09; 航路开辟者&#xff1a;杨剑砺、杨煜、耿远昊、李运佳、居凤霞领航员&#xff1a;范佳慧航海士&#xff1a;杨剑砺、伊雪、肖桐、李晴晴、蔡婧旎 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/fantastic…

训练不出结果_智能训练仪:专业化智能防控近视训练设备

视觉训练精准化&#xff0c;近视防控效果佳智能训练仪小百科 智能训练仪是一款近视防控全功能智能康复设备&#xff0c;一机集成十大视功能康复模块&#xff0c;针对各种视功能异常引发的儿童及青少年假…

贪心算法之最优装载

贪心算法通过一系列的选择来得到问题的解。它所做的每一个选择都是当前状态下局部最好选择。从许多的贪心算法求解的问题可以看到可用贪心算法求解的问题一般具有两个重要的性质&#xff1a;贪心选择性质和最优子结构性质。 1、贪心选择性质 贪心选择性质是 指所求问题的整体最…

百度认为什么样的网站更有抓取和收录价值

百度认为什么样的网站更有抓取和收录价值 百度认为什么样的网站更有抓取和收录价值呢?我们从下面几个方面简单介绍.鉴于技术保密以及网站运营的差异等其他原因&#xff0c;以下内容仅供站长参考&#xff0c;具体的收录策略包括但不仅限于所述内容。 第一方面&#xff1a;网站创…

【组队学习】【29期】2. 计算机视觉

2. 计算机视觉 航路开辟者&#xff1a;王程伟、任乔牧、张强、李芝翔领航员&#xff1a;杜蕊航海士&#xff1a;王程伟、任乔牧、张强、李芝翔 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-cv/tree/master/ImageProcessingFundamentals内…

python 列表维度_如何输出python中list的维度

python中输出list的维度可以使用numpy来实现:import numpy as np a = [[1,2],[3,4]] print(np.array(a).shape) 扩展: reshape&resize&shape改变数组维度 reshape函数:不改变原数组维度,有返回值 resize函数:直接改变原数组维度,无返回值 shape属性:直接改变原数…

SWFTools PDF转换为SWF

前言 在iText 制作PDF这篇博文中只是简单的介绍了如何制作PDF&#xff0c;为了能让PDF在Web页面中显示&#xff0c;我还需要通过SWFTools工具将PDF文件转换为SWF文件&#xff0c;然后通过SWF文件显示在Web网页中&#xff0c;本次主要是实践SWFTools工具的简单使用&#xff0c;可…

Springboot 中 Mybatis 的使用

2019独角兽企业重金招聘Python工程师标准>>> 官方文档&#xff1a; Mybatis开发团队为Spring Boot 提供了 MyBatis-Spring-Boot-Starter 方便使用。 要使用MyBatis-Spring-Boot-Starter模块&#xff0c;只需要在类路径中包含 mybatis-spring-boot-autoconfigure.ja…

【组队学习】【29期】3. 自然语言处理之情感分析

3. 自然语言处理之情感分析 航路开辟者&#xff1a;芙蕖、戴治旭、陈海顺领航员&#xff1a;初晓宇航海士&#xff1a;芙蕖、戴治旭、陈海顺、汪超 基本信息 开源内容&#xff1a;https://github.com/datawhalechina/team-learning-nlp/tree/master/Emotional_Analysis内容属…