7.2.1 捕获异常
try/catch 语句块:
try {code}catch (ExceptionType e) {handler for this type}

7.2.2 捕获多个异常

合并 catch:

7.2.3 再次抛出异常与异常链
可以在 catch 子句中抛出异常:

将原始异常设置为新异常的 “原因”:

7.2.4 finally 子句
不管是否有异常被捕获, finally 子句中的代码都会执行.


分几种情况:
- 没有任何异常, 执行顺序: 1, 2, 5, 6
- try 抛出异常, catch 捕获异常, catch 中不再抛出异常, 执行顺序: 1, 3, 4, 5, 6
- try 抛出异常, catch 捕获异常, catch 中再抛出异常, 执行顺序: 1, 3, 5
- try 抛出异常, catch 无法捕获异常, 执行顺序: 1, 5
可以没有 catch:
- 如果有异常, 那么向上抛出

finally 中的 return 会覆盖 try 中的 return:
- 方法返回前会执行 finally 中的语句
- 不要在 finally 中添加控制流语句
- return
- throw
- break
- continue

7.2.5 try-with-Resources 语句
使用 try-with-Resources 需要实现 AutuoCloseable 接口, 语法:
- try 块退出时自动调用 res.close()
try (Resource res = ...) {work with res}
可以指定多个资源:

Java9 中可以使用事实最终变量:

try 中的异常被抛出, close 方法抛出的异常会被抑制并使用 addSuppressed() 添加到原来的异常.
7.2.6 分析堆栈轨迹元素
- Throwable.printStackTrace()
- StackWalker.StackFrame
