今天是参加孤尽训练营的第三天,主要学习内容为 Java异常体系/异常处理/日志规约/错误码规,今天学习收获如下:
一 Java异常体系
异常处理流程:
JAVA异常处理机制:
JAVA异常体系:
异常抛出与捕获的原则:
JDK7资源关闭新姿势之try with resource流程解析:
比如 file类的Stream相关的流,都实现了clossable接口
使用Optional 优雅的防止 NPE:
foreach遍历集合的异常:
1.不要在foreach循环 里进行元素的 remove/add操作
2.foreach循环会自 动跳过遍历空集合 ,如果对于有null 值的集合,碰到 null时需注意NPE
二 日志规约
建议: 使用日志门面进行 slf4j 进行,一般使用注解@slf4j 和lomback
logback框架使用:
核心配置对象及属性分析
配置文件解析:
Appender节点配置示例:
logback日志框架关键类图分析
异步Appenter配置示例
线程模型分析
异常错误日志实时通知
三 日志输出规约
1.日志级别开关判断:对于 trace/debug/info 级别的日志输出,必须进 行日志级别的开关判断
2.异常日志信息要完整:异常日志信息应该包括 以下两类信息: 案发现场信息 异常堆栈信息
3.避免重复打印日志:重复打印日志,浪费磁 盘空间,务必在日志配 置文件中设置 additivity=false
扩展日志的设计与规约
扩展日志单独存储:应用中的扩展日志(如打点、临时 监控、访问日志等)单独存储
错误日志单独存储:业务日志与错误日志分开存储
四 错误码规约
功用:系统与系统 间的沟通;人与人之间 的沟通;人与系统之间 的沟通
规约:
定义时要有字母也要有数字
不要与业务架构或者组织架构挂钩
要分级分类管理
不能直接输出给用户作为 提示信息使用
使用者避免随意定义新的错误码
便于不同语言的开发者之间协作
五 异常处理与日志综合实践
1、在Controller层统一捕获异常
2、全局异常处理组件GlobalExceptionHandler 的定义和使用
3、API层异常设计实践
4、Service层异常设计实践
5、DAO数据处理层异常、日志实践
通用 DaoException 使用继承自Runtime Exception的通 用DaoException封装DAO层异常并向 上抛出
框架层面有选择性的 记录数据操作 在DAO层(框架层面)有选择的记录数据 操作的有效信息,比如:每次操作的原始 SQL 语句及其执行时
6、使用MDC实现轻量级调用链路追踪
分布式链路追踪 :将一次分布式请求还原成调用链路,将一次分布式请求的调用 情况集中展示,比如各个服务节点上的耗时、请求具体到达哪 台机器上、每个服务节点的请求状态等等
链路跟踪主要功能: • 故障快速定位 • 链路性能可视化 • 链路分析
7、用有限的异常类处理业务中复杂多变的无限可能
①通用ServiceException 定义继承自RuntimeException的 通用ServiceException业务异常
②结合ErrorCode 结合与业务关联的ErrorCode实 现复杂多变的业务异常需求
8、降低系统的维护难度与过度设计、冗余的手段