如何从抛出AbstractMethodError的破碎插件中恢复

时间:2016-10-11 09:55:29

标签: java plugins exception-handling

我正在修改java程序以搜索特定文件夹并在运行时加载插件。插件代码工作正常。我创建了一个UncaughtExceptionHandler来捕获未正确编码的插件的问题,并且大多数情况下都有效。除了一个问题(到目前为止,无论如何):

插件需要有一个实现特定接口的类,以便主程序将它们识别为插件。如果开发人员错过了其中一个抽象方法,则会抛出AbstractMethodError。它通过我的ExceptionHandler,我能够向用户发出一条消息,表明该插件存在问题。在那之后,程序就会挂起。我想要的是程序继续运行,以便我可以跳过其余的插件,从插件列表中删除它,让用户在没有它的情况下运行主程序。我在调用缺少的方法时直接放了一个try / catch块,但是catch没有被执行。它只是进入ExceptionHandler,然后......我不知道它在哪里。

这是我第一次尝试异常处理,所以我确定我只是错过了一些明显的东西。任何帮助将不胜感激。非常感谢。

1 个答案:

答案 0 :(得分:0)

来自Error类的子类的异常问题是大多数不可恢复(在您的情况下是AbstractMethodError)。根据{{​​3}}:

  

ErrorThrowable的子类,表示合理的应用程序不应该试图捕获的严重问题。大多数此类错误都是异常情况。 ThreadDeath错误,虽然是“正常”条件,但也是Error的子类,因为大多数应用程序不应该尝试捕获它。

即。在Error被抛出后,无法保证应用程序可以恢复。根据您加载/执行该插件的方式,可能会有一些变通方法。首先,如果在实际尝试exectuion之前有所需方法的实现,你可以通过反射(the Error class java-doc)检查加载的插件类 - 这样你就可以捕获/抛出Exception而不是获取Error并稍后暂停。

如果它不是一个选项,你可以通过分析线程转储重新进一步调查在获得该错误后实际挂起的内容 some examples