捕获ERROR

一、背景

目前工作中遇到2个情况因为捕获的是Exception而不是Error,导致程序无法正常运行。

1、使用google的ortools库(jni):因为和操作系统相关,需要判断运行环境是否兼容,如果不兼容,则不使用ortools库,而使用常规java库处理。判断的代码会抛出Error,需要catch Throwable。

2、使用自定义类加载器,做插件,抛出java.Lang.LinkageError,而程序捕获的是Exception。Error导致定时线程退出,处理程序变成“幽灵”,具体现象是:插件无法更新,且没有任何错误日志。

二、分析

通常建议程序只捕获Exception,而不捕获Error,后者是可以避免的,不应该是程序去处理。但特殊场景下,还是需要捕获Error,即catch Throwable,让人知道程序中发生什么问题。

顺便记录一下:

java.Lang.LinkageError 这个异常在使用多ClassLoader的应用程序时常常会遇到,但是具体它是怎么产生的,很少人能够回答上来,于是上来来一发。

描述一下碰到这个异常的场景:应用A中使用了自定义的classLoader来加载所属应用的多个插件,以便能使各插件包达到类隔离的效果,每个插件都依赖了应用A中提供的一个依赖包M,这个依赖包在应用A中是有加载的,一般情况下,只要组件的依赖中打包时去除掉这个依赖包M,就不会有问题。但是实际的操作中,有的插件开发者经常会有意无意的将排除这个事情忘记。当把包含了依赖包M的插件发布到应用A中时,就可能出现这个异常。提示:java.lang.LinkageError.

这个错误发生的原因是同一个限定名的class类被多个不同的ClassLoader加载后,相互交叉使用导致的类冲突的情况。同一个限定名的class在不同的classLoader中属于不同的 Class实例,而JVM在加载某一个类时,需要加载所有import进入的Class,这种情况下,如果自定义的classLoader中存在与parentClassLoader需要加载相同限定名的Class时,就会抛出java.Lang.LinkageError.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,try-catch语句用于捕获和处理异常。通过将可能抛出异常的代码放在try块中,然后在catch块中捕获和处理异常。catch块中的代码将在相应的异常被抛出时执行。引用中提到,我们通常将对Exception类的catch块放在最后,这是因为所有的异常对象都是Exception或其子类的实例。如果将Exception类对应的catch块排在其他catch块的前面,Java运行时将直接进入该catch块,而排在它后面的catch块将永远也不会获得执行的机会。 此外,引用中指出,在进行异常捕获时,应该按照先捕获小异常再捕获大异常的原则,即将父类异常的catch块排在子类异常的catch块后面。这是因为子类异常包含在父类异常中,如果将父类异常的catch块放在子类异常的前面,将会导致编译错误。 总结起来,try-catch捕获error的步骤如下: 1. 首先将可能抛出异常的代码放在try块中。 2. 然后在catch块中按照异常类的继承关系,从小异常到大异常的顺序进行捕获和处理。 3. 如果没有合适的catch块可以处理该异常,异常将被传递给调用该代码的上一级代码进行处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java Exception - 使用try-catch捕获异常](https://blog.csdn.net/qq_42764468/article/details/124595812)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [try_catch 捕捉异常错误](https://blog.csdn.net/Superman___007/article/details/82730602)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值