老师 我想咨询一下关于异常的知识

老师 我想咨询一下关于异常的知识

throw new ExceptionInInitializerError(e);
throw e;

在catch块中书写这两种抛出异常有啥区别?这两个分别什么时候用啊?我有点点不清楚了?throw e是不是在不知道会抛出什么异常的时候用对吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小脸 2022-11-02 18:29:25

同学你好,

1、throw e抛出的是e实例,也就是通过catch捕获的IOException或其他异常

https://img1.sycdn.imooc.com//climg/63623b1b099e75a804750055.jpg

如果是throw new ExceptionInInitializerError(e);抛出的是一个错误,当我们遇到IOException时主动抛出ExceptionInInitializerError通知调用者

2、需要结合具体的业务代码去决定,这里是为了sqlSession的初始化,由于静态代码块中的异常可能会影响程序的整体执行,所以需要将这个异常按照如下方式抛出去:throw new ExceptionInInitializerError(e)

3、关于throw e理解有误,同学可参考第一点

祝学习愉快~


  • 提问者 星辰很精彩 #1

    老师 你第二点句说的 “由于静态代码块中的异常可能会影响程序的整体执行,所以需要将这个异常按照如下方式抛出去:throw new ExceptionInInitializerError(e)”意思是不是当有异常出现的时候,在静态代码块中不在控制台打印出异常信息?

    2022-11-16 15:56:17
  • 提问者 星辰很精彩 #2

    老师 你第二点句说的 “由于静态代码块中的异常可能会影响程序的整体执行,所以需要将这个异常按照如下方式抛出去:throw new ExceptionInInitializerError(e)”意思是不是当有异常出现的时候,在静态代码块中出现的异常,不在控制台打印出异常信息?

    2022-11-16 15:58:29
  • 好帮手慕小脸 回复 提问者 星辰很精彩 #3

    同学你好,理解有误,这里是会在控制台打印输出异常信息的,同学可以自行测试代码试一下哟~另外为了便于同学更加理解这串代码,这里可参考如下更详细的解析:

    这里使用throw new的方式是有一些细节在里面的。同学可以注意一下,老师抛出的最终是Error结尾的错误,而不是Exception结尾的异常。这样做的目的是:
    在大型项目中,通常会有全局异常处理器,用来处理各种各样的异常,同时为了能够将所有异常都进行处理,所以会配置处理Exception类的处理器,这样的处理方式在后面SpringBoot项目中也有使用,同学学到这里的时候可以注意一下。
    使用全局处理机制,可以有效的统筹管理各种异常。但是课程中,能够引起SqlSessionFactory创建失败的问题,不应该被全局异常处理所捕获并处理,因为这样的问题通常不是通过代码可以解决的。例如缺失配置文件,什么样的代码也无法处理文件缺失的问题。
    但是如果此处使用异常,那么一定会被全局异常处理器捕获,因为上文提到,最终会有Exception类的处理器来兜底。这显然是和设计初衷是冲突的。

    为了解决这个问题,需要使用Exception之外的报错对象,并且Error在Java中对于错误的严重程度也比Exception要高,所以老师将异常包装为错误向上抛出,既能越过全局异常处理器,正常的将错误信息单独展示,也能提高这个问题的严重性级别,一举两得。
    如果是只是使用throw e的处理方式,显然会被全局异常处理器所捕获,就无法达到目标效果了。
    祝学习愉快~

    2022-11-16 17:35:48
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师