Java异常与日志处理

1,035 阅读3分钟

1.异常

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

什么是异常?

程序在运行时,发生了意料之外的事情,阻止了程序的正常执行,这种情况被称为异常。出现异常后,往往需要人工介入处理,否则会扩大异常的影响面。通常处理异常时,需要解决以下3个问题:

 1. 哪里发生异常?
 2. 谁来处理异常?
 3. 如何处理异常?

Java异常的分类

JDK中有一套完整的异常机制,所有异常都是Throwable的之类,分为Error(致命异常)和 Exception(非致命异常)。

Error是一种非常特殊的异常类型,他的出现标识着系统发生了不可控的错误,如:StackOverflowError、OutOfMemoryError,程序无法处理,只能人工介入处理

Exception又分为ckecked异常(受检异常)和 uncheck异常(非受检异常),ckecked异常是需要带代码中显示处理,否则编译会报错。uncheck异常是运行时异常,他们都继承RuntimeException,不需要程序进行显示的捕捉和处理。

image-20211031230519349.png

Java异常处理流程

image-20211031225142736.png

异常抛出与捕获的原则

  • 非必要不使用异常
  • 使用描述性消息抛出异常
  • 力所能及的异常一定要处理
  • 异常忽略要有理有据

try-catch流程解析

image-20211031231147223.png

2. 日志

什么是日志?

     记录操作行为及操作轨迹数据,可以数据化的分析用户偏好,有助于优化业务逻辑,为用户提供个性化服务。当系统线发生线上问题时,可以快速的定位问题,处理问题

image-20211031231901033.png

日志记录规约

• 系统应依赖使用日志框架(SLF4J、JCL)的 API而不是具体日志库中的 • 在日志输出时,字符串变量之间的拼接使用占位符的方式 • 日志打印时禁止直接用 JSON 工具将对象转换成 String • 尽量用英文来描述日志错误信息

日志输出规约

image-20211031232157512.png

日志输出规约

  • 日志级别开关判断:对于trace/debug/info级别的日志输出,必须进行日志级别的开关判断
  • 异常日志信息要完整:应包括一下两类信息:案发现场信息、异常堆栈信息
  • 避免重复打印日志

扩展日志的设计与规约

  • 扩展日志单独存储:应用中的扩展日志(如打点、临时监控、访问日志等)应单独存储
  • 错误日志单独存储:业务日志与错误日志分开存储

错误码规约

  • 定义时要有字母也要有数字
  • 要分级分类管理
  • 不能直接输出给用户作为提示信息使用
  • 不要与业务架构或者组织架构挂钩
  • 使用者避免随意定义新的错误码
  • 便于不同语言的开发者之间协作