ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 第三章第三节-抛出异常 标签(空格分隔): 廖雪峰 --- ## 异常的传播 - 如果当前方法没有捕获异常,异常就会被抛到上层调用方法. - 如果上层也未捕获,会一直向上抛.知道遇到`try catch`为止,或者在main中声明throw. - `exception.printStackTrace`可以打印异常调用栈,在debug的时候很有效. ## 如何抛出 - 创建某个`Exception`的实例. - 使用throw语句抛出. ## 转换异常 如果一个方法捕获了某个异常之后,又在`catch`子句中抛出新的异常,就相当于把抛出的异常转换成新的异常.新的异常有是否带参数两种方式,带参数的话就相当于保留了之前的异常栈,如果无参数就相当于舍弃了异常栈,即无法追踪到最开始导致出错的地方. ## finally中的执行顺序. ```java try{ 语句1 } catch{ 语句2 throw new Exception() } finally{ 语句3 } ``` 执行的顺序是:语句1,语句2,语句3,然后抛出新的异常. 若: ```java try{ 语句1 } catch{ 语句2 throw new Exception1() } finally{ 语句3 throw new Exception2() } ``` 执行的顺序是:语句1,语句2,语句3,异常2(异常1则会被忽略). **最好不要在finally中抛出异常** ## 小节小结 - printStackTrace()打印异常的传播栈,对于调试非常好用. - 捕获异常并在此抛出时异常时(异常转换),应该保留原始异常的信息(含参数创建). - 如果在finally中抛出异常,应该把新的异常添加在原有异常中,不然原有异常会被忽略(复杂变换未记录). - 使用getSuppressed()可以获取所有添加的SuppressedException. - 处理SuppressedException要求大于1.7.