【问题标题】:What is the finally block for compared to just writing code after the try statement?与在 try 语句之后编写代码相比,finally 块是什么?
【发布时间】:2014-04-16 17:17:01
【问题描述】:

换句话说,这两者有何不同?

try
{
    // Something that can throw an error
}
catch
{
    // Handle the error
}
finally
{
    // Something that runs after the try statement
}

对比

try
{
    // Something that can throw an error
}
catch
{
    // Handle the error
}
// Something that runs after the try statement

【问题讨论】:

  • 如果发现错误,最后使用。
  • 你有没有尝试过没有catch的try-finally?
  • 当使用 try 块时,无论是否发生异常,finally 块中的代码都保证运行。
  • 这是一个明显的 RTFM 案例:msdn.microsoft.com/en-us/library/zwc8s4fz.aspx
  • 您是否先通过 Google 搜索文档?

标签: c# javascript try-catch-finally


【解决方案1】:

finally 块始终执行。

你可以肯定,这个块无论如何都会被执行。

字面意思是这样的:

尝试一些东西,捕捉一些异常(如果被告知并且它们是否存在)并执行 finally 最终阻塞。

【讨论】:

【解决方案2】:

如果 try 块中有中断或异常,可能会导致程序停止。在像这些强制执行的代码的情况下,例如关闭打开的连接并将项目返回到连接池,这些代码将写入 finally 块中。 finally 块确保写入其中的代码将被执行。

【讨论】:

    【解决方案3】:

    如果您只使用一般捕获(即 catch 没有 args 或 catch(Exception ex)),是否将代码放在 finallytry/catch 之后基本上是一种风格选择,作为 finally 块和try/catch 之后的代码将在任何情况下执行(除非故意使用转义机制,例如 return)。

    但是,如果您使用窄的catch,并且没有捕获到异常,则会发生finally 块仍会执行,但try/catch 之后的代码不会。

    【讨论】:

    • 这不是真的。任何形式的流控制(gotocontinuebreakreturnyield break)都可以绕过这样一个非 finally 块。这将保护您免受throw 作为流量控制机制。
    • 是的,但这不是我的意思——我的意思是,跟随 try/catch 块和 finally 块之间的流程将与您只是在 @987654339 之后放置代码相同@,我认为这让提问者感到困惑。当您使用 catch() 的较窄形式时,会出现使用 finally 与否之间的区别。
    猜你喜欢
    • 2011-11-17
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2017-09-20
    • 2019-12-21
    相关资源
    最近更新 更多