Web全栈应用之旅-基础篇(二)异常设计

383 阅读3分钟

banner窄.png

铿然架构  |  作者  /  铿然一叶 这是铿然架构的第 11 篇原创文章

相关阅读:

萌新快速成长之路
如何编写软件设计文档
JAVA编程思想(一)通过依赖注入增加扩展性
JAVA编程思想(二)如何面向接口编程
JAVA编程思想(三)去掉别扭的if,自注册策略模式优雅满足开闭原则
JAVA编程思想(四)Builder模式经典范式以及和工厂模式如何选?
Java编程思想(七)使用组合和继承的场景
JAVA基础(一)简单、透彻理解内部类和静态内部类
JAVA基础(二)内存优化-使用Java引用做缓存
JAVA基础(三)ClassLoader实现热加载
JAVA基础(四)枚举(enum)和常量定义,工厂类使用对比
JAVA基础(五)函数式接口-复用,解耦之利刃
Seata源码(一)初始化
Seata源码(二)事务基础对象
Seata源码(三)事务处理类结构和流程
Seata源码(四)全局锁GlobalLock
Seata源码(五)Seata数据库操作
Seata源码(六)Seata的undo日志操作
Seata源码(七)Seata事务故障处理
Seata源码(八)Seata事务生命周期hook
Seata源码(九)TCC核心类和处理逻辑
Seata源码(十)RM接收到请求后的调用过程
Seata源码(十一)TC接收到请求后的处理过程\


一、异常设计

异常设计主要考虑以下方面:

二、异常信息

异常信息包含:

  1. 错误码:异常的唯一编码。
  2. 错误描述:告知使用者和调用方的描述信息。
  3. 异常堆栈:Java开发过程中,不可避免的会有未考虑的异常场景,堆栈信息可以帮助快速解决故障。
  4. 异常变量:错误描述中可替换的变量,变量的实际取值可以帮助快速查找错误原因,例如:
ERR-1001=用户证件错误,用户ID:{}

其中ERR-1001是错误码,后面是错误描述,{}为可替换的变量,实际异常抛出时,可传入变量,由异常框架来统一处理。

三、异常分类

异常分类的作用是根据不同的异常类型可以走不同的处理分支,如果有这样的需要,可以对异常分类,否则可以不做区分,统一使用一个异常类则可。另外,通过对错误码分类也可以达到走不同处理分支目的,所以异常分类并不是必须的,而且定义多了使用时还得思考应该用哪一个,个人倾向简化处理。

四、处理策略

  1. 捕捉时机:在实际Java代码中,调用链可能如下:


那么异常该在哪里捕捉?
建议是:如果不因异常而改变处理逻辑,就不需要捕捉异常,一直向上抛,让公共框架统一处理然后返回给前端。这样做的好处是逻辑统一,也不需要伤脑筋思考到底要不要捕捉异常。
2. 异常日志
有时候需要借助异常堆栈信息定位错误原因,而用户未必能记得和反馈错误堆栈信息,此时要么是自行复现错误来定位,要么是通过历史错误日志定位。通过错误日志定位就要将错误信息记录下来,一般通过文件日志记录,也可以采集后记录到数据库中,方便查询,入库时为了避免错误日志太多,可以考虑将堆栈信息的hash值也记录下来,对于hash值重复的异常,只需要更新最后发生时间,这样就能减少异常日志的大小。
3. 异常界定
异常界定主要考虑查询不到数据时是否要作为异常返回,对此不应作为异常,而是由调用方自行判断是否要作为错误。

end.