【问题标题】:Why shouldn't we cleanup in the catch block? [duplicate]为什么我们不应该在 catch 块中进行清理? [复制]
【发布时间】:2012-10-20 09:18:26
【问题描述】:

可能重复:
Why use Finally in Try … Catch

为什么我们不应该使用 catch 块来清理代码?

我没有过多地使用错误处理技术,但现在我开始将它们用于几乎每个程序。 关于时间

所以,在浏览文章/文档时,我遇到了 finally 块。

正如它所暗示的,无论是否有异常,finally 块都会运行(当然,如果 JVM 或 PC 强制关闭,它不会运行)。 finally 块通常用于清理代码(资源)。

所以基本上,如果我的代码没有出现异常,那我为什么要清理代码。我不应该把清理代码放在 catch 块而不是 finally 块中吗?

我尝试寻找类似的问题,但似乎没有人问过这个问题。所以我继续创建了一个问题:D

【问题讨论】:

  • 一个经典的例子是文件资源,不管遇到异常都需要关闭。
  • @DNA 这是一个 VB.NET 问题。
  • 或数据库连接。无论您是否遇到异常,您都应该始终释放您的数据库连接。
  • 异常也不是您想要清理的唯一时间。例如,如果您正在从输入流中读取数据,无论是否发生异常,您都希望关闭该流,因此将其放在 finally 块中可以保证它会被调用。
  • @Robert Harvey 好尴尬!很明显,我该睡觉了。但是再看一遍,我不确定在这种情况下它是否重要——概念和推理是一样的。

标签: java exception-handling try-catch-finally


【解决方案1】:

因为catch不能保证执行。finally 块确实有这样的保证,除非你把电源线踢出墙。

【讨论】:

  • 或者你打电话给System.exit()...或者你的CPUgets hit by a cosmic ray...
  • 或者如果地球被外星人摧毁了。
  • 但是,如果清理代码干扰我的代码怎么办,在这种情况下,我希望它仅在捕获到异常时运行。我已经放置了一个标志,如果发生异常则设置为真。这是一个不好的做法吗?因为这与在 catch 块中设置清理代码不同。
  • 当代码“举手”并说“发生了不好的事情;我现在不知道该怎么办,所以我要抛出”时,就会发生异常。您可以决定处理它,或者重新抛出,或者只是允许异常进入调用堆栈并让其他人处理它。在这种情况下,您必须假设要清理的东西无论如何都处于无效状态,或者您可以简单地在catch 中尝试其他东西。在catch 中的代码完成执行之前,finally 不会执行,让您有时间完成工作,无论是什么。
【解决方案2】:

正如@RobertHarvey 指出的那样,catch不能保证执行,所以finally 块是为了避免使用此类代码以使您的代码更清晰:

    try
    {
        // do something
    }
    catch(Exception e)
    {
        // error handling
        // clean up
    }
    // clean up

这样你就可以这样:

    try
    {
        // do something        
    }
    catch(Exception e)
    {
        // error handling
    }
    finally
    {
        // clean up
    }

finally 块将在您想要执行第一个代码时为您提供帮助,即您想要清理(例如关闭文件)无论是否有异常,如果您只想清理如果发生错误,你 CAN 在 catch 块中清理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2013-02-20
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多