首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用不带“catch”块的“try-finally”块

使用不带“catch”块的“try-finally”块
EN

Stack Overflow用户
提问于 2012-02-15 18:14:21
回答 11查看 71K关注 0票数 89

是否存在适合使用不带catch块的try-finally块的情况?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2012-02-15 18:15:25

您可以使用它来确保某些操作发生在try内容之后或异常上,但是当您不希望使用该异常时。

为了清楚起见,这并不会隐藏异常。在异常沿调用堆栈向上传播之前,将运行finally块。

在使用using关键字时,您也可能会无意中使用它,因为它会编译成一个try-finally (不是精确的转换,但出于参数的考虑,它已经足够接近了)。

代码语言:javascript
复制
try
{
    TrySomeCodeThatMightException();
}
finally
{
    CleanupEvenOnFailure();
}

finally中运行的代码不能保证运行,但是不能保证它的情况是相当边缘的-我甚至记不住了。我所记得的是,如果你在这种情况下,很可能不运行finally不是你最大的问题:-)所以基本上不用担心。

来自托比亚斯的更新:如果进程被终止, finally将不会运行。

来自帕迪的更新: Conditions when finally does not execute in a .net try..finally block

您可能会看到的最常见的示例是,即使代码失败,也要处理数据库连接或外部资源:

代码语言:javascript
复制
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
    // Do stuff.
}

编译成类似如下的内容:

代码语言:javascript
复制
SqlConnection conn;

try
{
    conn = new SqlConnection("");
    // Do stuff.
}
finally
{
    if (conn != null)
        conn.Dispose();
}
票数 134
EN

Stack Overflow用户

发布于 2012-02-15 18:17:37

using相当于try-finally。只有当你想在finally中做一些清理工作而不关心异常时,你才会使用try-finally

的最佳方法将是

代码语言:javascript
复制
try
{
   using(resource)
   {
       //Do something here
   }   
}catch(Exception)
{
     //Handle Error
}

这样做即使using调用的清理失败,您的代码也不会失败。

在某些情况下,finally不会被执行。

如果存在从外部源终止的任何StackOverflowExceptionExecutingEngineException.

  • Process,则执行

希望这能解答你的疑虑。

票数 5
EN

Stack Overflow用户

发布于 2015-04-16 18:03:20

使用代码进行很好的解释:

代码语言:javascript
复制
void MyMethod1()
{
    try
    {
        MyMethod2();
        MyMethod3();
    }
    catch(Exception e)
    {
        //do something with the exception
    }
}


void MyMethod2()
{
    try
    {
        //perform actions that need cleaning up
    }
    finally
    {
        //clean up
    }
}


void MyMethod3()
{
    //do something
}

如果MyMethod2或MyMethod3抛出异常,它将被MyMethod1捕获。但是,在将异常传递给MyMethod1之前,MyMethod2中的代码需要运行清理代码,例如关闭数据库连接。

http://forums.asp.net/t/1092267.aspx?Try+without+Catch+but+with+finally+doesn+t+throw+error+Why+no+syntax+error+

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9291437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档