重写方法不会抛出任何异常时的异常处理

时间:2011-10-06 14:26:54

标签: java exception-handling

简短形式:当被覆盖的方法没有抛出异常时,如何抛出异常(或执行好的,干净的异常处理;或者至少肮脏地强制执行停止)?

上下文:我们拥有一个可以使用Java“宏”自动化的专有软件的许可。用户定义的宏必须是以下形式:

public class MyMacro extends SoftwareMacro {
    public void execute() {
        // user code goes here
    }
}

即。扩展SoftwareMacro并且具有覆盖基类“execute的方法execute的类。这个重写execute的内容是......当......播放宏时执行...

但被覆盖的execute方法显然不会抛出任何异常。

execute() in com.mycompany.mypackage.MyMacro cannot implement execute() in 
somesoftware.base.SoftwareMacro
overridden method does not throw java.lang.Exception

也许这是天真的,但在开发时我通常喜欢将相应的异常类型冒泡到顶部并强制执行停止,以便我可以看到它们并继续调试。这显然不是一个选择。

我应该选择投掷RuntimeException吗? (因为RuntimeException不需要指定)感觉有点草率,并且基本类方法的“违反精神”。

P.S。不,我无法更改覆盖execute方法的源代码。

4 个答案:

答案 0 :(得分:4)

看起来意图是每个SoftwareMacro都执行自己的错误处理。如果需要,请在整个try方法周围使用大execute(),但不要让任何异常逃脱。在执行方法中执行您需要执行的任何清理操作,并且可能为用户打印错误消息,如果它们提供了执行此操作的方法。

您应该检查它们提供的所有API - 也许您应该使用错误报告工具。

答案 1 :(得分:4)

这一切都取决于“宏播放器”遇到运行时异常时的作用,以及你想要发生的事情。

如果它根本不处理它,但你不关心,抛出一个RuntimeException。

如果它正确处理它们,则抛出RuntimeException。

如果它没有正确处理它们,并且你不希望它失败,那么抓住你的execute方法中可能发生的异常,并按你认为最好的方式处理它们:显示错误对话框,输出错误信息,在日志中记录一些错误......

答案 2 :(得分:1)

“应该”意味着有正确的答案,IMO没有满足您的需求。

如果系统可以容忍运行时异常,并且它满足您的需求,为什么不呢?

并非您有选择权,因为您无法抛出已检查的异常。

(检查异常对我来说似乎是一次失败的实验,虽然我理解这一动机。)

答案 3 :(得分:0)

只要execute代码没有吸收异常,如果遇到异常,它仍会抛出它。如果抛出的异常类型是RuntimeExceptionRuntimeException的子类,则不需要显式声明它们,主要是因为编译器不强制执行它们的声明(顾名思义)它们只在运行时发生,并且在编译时不能必然预测。

但是,如果您说过的execute方法无法修改,则会吸收异常,并且不会通过日志条目,返回值或某种{表示异常{1}}我认为你运气不好。

我同意Ernest的看法,意图是RuntimeException方法完成所有自己的异常处理。

注意:被覆盖的方法签名在它们抛出的异常时不需要完全匹配 - 只需要名称,返回类型和列表&变量类型。