异常

异常体系

mindmap    Object        Throwable            Exceptions                Check Exception                    IOException                    SQLException                    ClassNotFoundException                RuntimeException                    NullPointerException                    ArithmeticException                    IndexOutOfBoundsException            Errors                StackOverFlowError                VirtualMachineError                OutOfMemoryError

分类

使用

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)属于非受检异常,如果定义的受检异常,则一旦异常发生变更,则依赖该层的所有上层全都要发生变更