c# - 没有catch block 的finally block 是java反模式吗?

标签 c# java c++ exception try-catch-finally

在对一些看起来像这样的代码进行故障排除时,我遇到了非常痛苦的故障排除经验:

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

问题很难解决,因为 doSomeStuff() 引发了异常,这反过来又导致 doSomeOtherStuff() 也引发了异常。第二个异常(由 finally block 抛出)被抛出到我的代码中,但它没有处理第一个异常(从 doSomeStuff() 抛出),这是问题的真正根本原因。

如果代码是这样说的,问题就会很明显:​​

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

所以,我的问题是:

在没有任何 catch block 的情况下使用 finally block 是众所周知的 java 反模式吗? (它当然似乎是众所周知的反模式“不要吞噬异常!”的一个不太明显的子类)

最佳答案

一般来说,不,这不是反模式。 finally block 的目的是确保无论是否引发异常,都可以清理内容。异常处理的全部意义在于,如果您无法处理它,您可以通过提供的相对干净的带外信号异常处理提供的方法,让它冒泡给可以处理的人。如果您需要确保在引发异常时清理内容,但无法正确处理当前范围内的异常,那么这正是正确的做法。您可能需要更加小心,以确保您的 finally block 不会抛出。

关于c# - 没有catch block 的finally block 是java反模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601152/

相关文章:

java - 没有 this() 的构造函数链接

java - Install4j:运行批处理文件/脚本文件以进行回滚操作

java - 如果服务正在运行,如何在晚上 8 点停止该服务?

c++ - std::wistringstream 解析时可以忽略字符串中的空格吗?

Javascript - 发送编码二进制 (zip) 文件数据并在 C# 中对其进行解码

C# 反射——加载外部 DLL 和所有依赖项

c# - MVC 中 ViewModel 构建器的接口(interface)

c# - 在数据库中只存储日期而不是时间部分 C#

c++ - 为什么此代码不创建竞争条件?

c++ - C++中如何比较两个对象的成员变量?