异常

指的是程序在执行过程中,出现的非正常的情况,终会导致JVM的非正常停止

异常体系

批注 2020-05-27 165048

分类

使用

try{
    // do something
}catch (Throwable t){
    t.printStackTrace();
    throw new RuntimeException(t);
}finally {
    // resource recycle
    /*以下情况finally不会执行
        前面的代码中用了 System.exit(int)已退出程序
        try代码块出现了死循环或者死锁
        CPU关闭
    */
}

注意事项

异常的性能开销

  1. try-catch 往往会影响 JVM 对代码进行优化
  2. 每实例化一个 Exception,都会对当时的栈进行快照,这是一个相对比较重的操作,该操作会逐一访问当前线程的 Java 栈帧,并且记录下各种调试信息,包括栈帧所指向方法的名字,方法所在的类名、文件名,以及在代码中的第几行触发该异常

关于系统设计中的异常

远程服务调用应该使用result对象来封装错误码与描述 主要是因为:

  1. 防止调用方没有捕获
  2. 异常对调用方的帮助不会很大

基于防御式编程, 服务提供方可以返回null, 调用方要进行事先判断 防止NPE

如果由于 “吞掉” 了接口的异常,有些业务异常中包含的错误原因,无法传给上层再封装给前端,可能会造成出错后用户懵逼,实际开发中,一般都不会吞掉异常,遇到 “吞掉” 异常的场景要慎重思考是否合理

通常开发中自定义的业务异常(BusinessException)属于非受检异常,如果定义的受检异常,则一旦异常发生变更,则依赖该层的所有上层全都要发生变更