李文轩 2019-03-08
声明:这是本人学习极客时间的Java核心36讲的笔记,有侵权请联系我。
Throwable类:
- Exception 和 Error 都继承了 Throwable 类
- Java 中只有 Throwable类的实例才可以被抛出(throw)或者捕获(catch)
Exception:
- 程序正常运行中,可预见的意外情况
- 应该被捕获并处理
checked vs. unchecked
- checked 必须在源代码中显式得捕获处理,编译期检查的部分
- unchecked 是 运行时异常,大多为编码的逻辑错误,按情况决定捕获
Error:
- 正常情况下,不太出现的情况
- 多数出现在,JVM自身处于不正常状态,不可回复的状态
- 不需要捕获
具体 throwable class
Java_Throwable实践:
- 尽量不要捕获类似 Exception的通用异常,而是应该捕获特定异常
- 被抛出的异常该体现出尽量多的信息,通常异常往往隐藏了部分信息
- 不要生吞(swallow)异常
- 即假设代码可能不会发生(极其危险),检查到这个异常时不给任何措施
- 这样的处理会导致,如果真的运行到这段代码,没有人会知道发生了什么
- 产品中用 printStackTrace() 的选择错误
- printStackTrace() 仅仅是输出到 standard error steam (STERR),对于产品来说,往往输出到产品日志会是更好的选择;因为复杂的系统,我们很难判断 printStackTrace() 会输出到哪
Throw early, catch late
- 不要用一个 variable 的时候才抛出异常,应该在有权利查看时,就检查。
- 保留原有异常的 cause 信息,直接抛出或者建立新异常抛出
自定义异常:
- 目的:保证提供足够信息
- 考虑:
- 是否定义为
checked Exception
; 这种类型设计就是为了从异常情况中恢复 - 避免敏感信息,以及可能导致的潜在的安全问题
- 是否定义为
性能角度审视Java的异常处理机制(try-catch):
- 产生额外的性能开销
- 建议只把try 用在必要的代码段
- try 比 if 和 switch 要低效
- exception 的实例化,都会对栈进行快照
- 栈的快照开销巨大
网友评论