当前位置: 首页 > 面试题库 >

是没有catch块的finally块是Java反模式吗?

倪鸿禧
2023-03-14
问题内容

我对故障排除看起来像是非常痛苦的故障排除经验,如下所示:

try {
   doSomeStuff()
   doMore()
} finally {
   doSomeOtherStuff()
}

该问题很难解决,因为doSomeStuff()引发了异常,这又导致doSomeOtherStuff()也引发了异常。第二个异常(由finally块引发)抛出了我的代码,但是它没有第一个异常(由doSomeStuff()引发)的句柄,这是问题的真正根源。

如果代码改为这样说,那么问题就很明显了:

try {
    doSomeStuff()
    doMore()
} catch (Exception e) {
    log.error(e);
} finally {
   doSomeOtherStuff()
}

所以,我的问题是这样的:

在没有任何catch块的情况下使用的finally块是否是众所周知的Java反模式?(它显然是显然著名的反模式“ Do n’t
gobble异常!”的一个不太明显的子类。)


问题答案:

通常,不,这不是反模式。finally块的目的是确保无论是否引发异常,都会清理东西。异常处理的全部要点是,如果您不能处理它,则可以通过相对干净的带外信号异常处理提供的功能,让异常冒出来的人可以解决。如果您需要确保在引发异常时清除所有内容,但不能在当前范围内正确处理该异常,那么这就是正确的做法。您可能只是想更加小心一点,以确保您的finally块不会抛出。



 类似资料:
  • 问题内容: 我正在审查一些新代码。该程序仅具有try和finally块。由于不包含catch块,如果try块遇到异常或任何可抛出的异常,它将如何工作?它是否直接进入了finally块? 问题答案: 如果try块中的任何代码都可以引发已检查的异常,则它必须出现在方法签名的throws子句中。如果引发了未经检查的异常,则该异常会冒泡退出方法。 无论是否引发异常,都始终执行finally块。

  • 问题内容: 考虑到此代码,我是否可以绝对确定该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果您调用 System.exit() 如果您调用 Runtime.getRuntime().halt(exitStatus) 如果JVM首先崩溃 如果JVM在try或catch块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM

  • 问题内容: 考虑到此代码,我是否可以绝对确定该块始终执行,无论它是什么? 问题答案: 是的,将在执行或代码块后调用。 唯一不会被调用的时间是: 如果你调用 如果你调用 如果JVM首先崩溃 如果JVM在或catch块中达到了无限循环(或其他不间断,不终止的语句) 操作系统是否强行终止了JVM进程;例如,在UNIX上 如果主机系统死机;例如,电源故障,硬件错误,操作系统崩溃等 如果该块将由守护程序线程

  • 本文向大家介绍说明PowerShell中的Try / Catch / Finally块,包括了说明PowerShell中的Try / Catch / Finally块的使用技巧和注意事项,需要的朋友参考一下 PowerShell中的Try / Catch块用于处理脚本中产生的错误。具体而言,错误应该是终止错误。在最后在PowerShell中块不是强制性的,每次沿写try / catch语句,但它会

  • 问题内容: 根据Java语言规范的第§14.20.2节 通过首先执行try块来执行带有finally块的try语句。然后有一个选择: 如果try块的执行正常完成,则执行finally块,然后可以选择: 如果finally块正常完成,则try语句正常完成。 如果finally块由于原因S突然完成,则try语句由于原因S突然完成 如果我正确地解释了它,那么在执行try块之后最终会被调用,但是所有这些如

  • 因此,我开始使用Java8streams/lambda表达式,遇到了一些有趣的问题,我不知道如何解决这些问题。所以我在这里,请求你的帮助。 现在我得到编译器错误“在lambda表达式中使用的变量应该有效地是final”。 怎么做? 方法createNewDocument和createOldDocument引发异常,因此调用必须在try/catch块内。我还需要关闭finally块内的文档。