java如何处理异常

异常的继承关系

所有异常都是继承自Throwable类及其子类,Throwable类有两个主要的子类,一个是Error一个是Exception,语义上来说Error比较严重,表示当前程序执行不下去也无法恢复。Exception下有一个子类叫RuntimeException,RuntimeException和Error是非检查异常,即不需要显示的处理和接收的异常,其他异常则必须进行显示的try-catch处理或重新throw出去。

异常的处理模块

try模块:需要监控的代码块,其中若产生了异常则交给catch块处理

catch模块:处理异常的模块。采用自上到下依次匹配异常类型的方式进行,若匹配到异常则进入对应的处理模块中。

finally模块:无论异常是否发生,方法执行结束后都需要执行的模块,一般用于资源清理。

java7之后的异常处理新增了try with resource 模块的功能,可以在try关键词后跟一些实现了AutoCloseable接口的对象创建,这样在发生异常或执行结束之后,会自动调用对象的close方法进行资源清理。同时catch模块可以支持同一块代码匹配多个异常,采用’|'符号进行分割。

异常发生之后如果被catch住,由catch块重新抛出,首次异常的信息却已经丢失,之后接收的异常只能是catch块重新抛出的异常。为了不丢失异常信息,java7新增了suppressed异常,可以调用Throwable.addSuppressed()方法添加。

异常的生成

异常生成需要打印当前线程的整个栈调用情况,包括一些额外信息,例如方法名、类名、文件名、抛出异常的行数等等。因此是一个很耗时的工作。

字节码层的实现

每个方法都会有一个异常表,对应每一个catch模块,记录{from, to, target, type}字段,from~to表示异常监控的代码块起止字节码索引,target表示对应catch模块代码入口字节码索引,type代表catch模块的异常类型。

为了实现finally模块在正常流程、异常流程、以及catch模块仍抛出异常的情况下均能执行的功能,finally模块的代码被复制了三份,分别放在try模块后,catch模块后,方法退出前。

try -> finaly
                catch -> finally
                                    -> finally

若正常流程则是try,然后finally;若是抛出异常并被catch捕获,则try->catch->finally;若是catch未捕获或catch仍抛出了,则指定第三个finally。

第三个finally仍然是通过异常表的形式实现,from为try模块的开始,to为catch模块的结束,target指向第三个finally模块,type是任何异常类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值