7-1异常
再次抛出异常与异常链
再次抛出异常,并将原始异常设置为新异常的”原因”
1 | try |
获得原始异常:Throwable e = se.getCause() ;
建议使用这种包装技术。这样可以让用户抛出子系统中的高级异常,而不会丢失原始异常的细节。
例如:在一个方法中发生了一个受查异常, 而不允许抛出它, 我们可以捕获这个受查异常,并将它包装成一个运行时异常。
Throwable.addSuppressed 添加抑制异常,用于异常后在finally语句再次出现异常时
Throwable.getSuppressed
异常机制的技巧
- 异常处理不能代替简单的测试 (判空与抛出空引用异常,抛出异常性能低很多)
- 不要过分地细化异常 (每行一个trycatch)
- 利用异常层次结构,选择合适的异常抛出,不要只使用RuntimeException,Throwable异常
- 不要压制异常 (不要catch块什么也不做,吞掉异常)
- 在检测错误时,“ 苛刻 ” 要比放任更好。 比如:在用无效的参数调用一个方法时,返
回一个虚拟的数值, 还是抛出一个异常, 哪种处理方式更好? 例如, 当栈空时,Stack.p0p 是
返回一个 null, 还是抛出一个异常? 我们认为:在出错的地方抛出一个 EmptyStackException
异常要比在后面抛出一个 NullPointerException 异常更好。 - 不要羞于传递异常
最后两条总结:早抛出,晚捕获