Exception和Error有什么区别?

典型回答

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类。Exception 是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。
Error 是指在正常情况下,不大可能出现的情况,绝大部分的 Error 都会导致程序(比如 JVM 自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。
Exception 又分为 可检查 (checked)异常和 不检查 (unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的 Error,是 Throwable 不是 Exception。
不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。


追问:你了解哪些 Error、Exception 或者 RuntimeException?
Exception和Error有什么区别?_第1张图片
其中有些子类型,最好重点理解一下,比如 NoClassDefFoundError 和 ClassNotFoundException 有什么区别,这也是个经典的入门题目。

实际项目中Log使用规范


1、记录log的目的:系统稳定性

  • 系统行为的记录和监控
  • 问题(线上bug、业务疑点等)的定位

2、好的日志系统应该如何

  • 自动的分类记录系统中各种事件行为(例如:http访问、rpc调用、消息的产生和消费等等)
  • 业务日志单独记录、方便问题定位
  • 异常日志、即时告警
  • 日志能够自动记录行为的主体、登陆态
  • 链路追踪

3、我们的log系统

  • 通过PrefFilter来在特定的文件中记录所有http请求的输入参数、响应时间、响应code等
  • 生产环境记录WARN以上级别的日志、其他环境的log等级为DEBUG
  • 部分异常日志通过钉钉群的方式产生告警、还有很多并未产生告警

4、异常日志使用规范:需要告警的使用error,否则用WARN

  • 目前系统通过在业务代码中抛出serviceException、然后统一处理exception来达到标准错误返回值的目的
  • 从告警的角度:serviceException太多,不可能所有这种异常都需要告警,所以所有的serviceException都不告警
  • 部分确实需要告警的异常也被包装成为了serviceException,导致这部分无法告警通知到人,会让我们失去修复问题的时间窗口

5、如何编码

  • 一个方法的正常处理流程:1、校验;2、业务处理;3、异常处理
  • 校验阶段的错误应该都采用WARN
  • 业务处理阶段的错误看情况
  • 异常处理阶段的错误应该都采用ERROR
  • 外部依赖:属于业务想定范围之类的错误返回应该采用WARN、业务想定之外的采用ERROR
  • 总之:参考第四大点的规范:需要告警的使用error、否则使用WARN

你可能感兴趣的:(Java学习,Java,web)