C#: 为什么要使用 'finally' 子句?

3

可能是重复问题:
为什么在C#中使用finally?

在C#中,使用finally子句的目的是什么?

例如。

try {
        // do something
    }
catch (Exception exc)
    {
        // do something
    }
// do something

最后的代码不管怎样都会执行吗?finally块有什么作用呢?


@Otávio 如果try或catch块中的代码发出返回命令会怎么样? - Jamie Keeling
7个回答

7

最后是针对即使catch抛出异常的情况,finally允许您在成功和失败时执行代码,finally将始终被执行。始终。

好的,除非应用程序在系统级别被终止或计算机爆炸。


2
-1:"总是"是一个很强的词。StackOverflowException? - Aryabhatta
2
@Moron:“总是”可能确实是一个强烈的词,但它是唯一一个不需要额外解释段落并且能够表达观点的词。 - AllenG
@AllenG:不同意。我宁愿有更多的解释,也不要错误的东西! - Aryabhatta
1
StackOverflowException 执行引擎异常(在FailFast()上)。两者都不执行finally块。这是一个回答问题的网站,而不是提供可能最终会伤害用户的误导信息。 - Bob G
9
我不知道...如果进程被终止或计算机爆炸,我仍然相信最终块会在软件来世的神秘领域中以某种方式执行。 - Dr. Wily's Apprentice

1

finally 块确保在前两个语句被激活时,块中的任何内容都将被执行。

一个很好的例子是释放数据库资源。

尝试-捕获-最终执行

示例:

try
{
   //Open a database connection
}
catch
{
   //Catch exception, database connection failed
}
finally
{
   //Release the opened database connection resources
}

0

因为有一些对象需要进行清理,否则会对您的应用程序造成问题。

经常使用的例子是使用 SqlConnection:

SqlConnection conn = new SqlConnection(connString);

try
{        
    conn.Open();

    throw new ArgumentException();
}
catch(SqlException ex)
{
}

在这种情况下,由于处理SqlException时引发了ArgumentException异常,所以SqlConnection保持打开状态而无法关闭。 如果使用finally块,则不会发生这种情况,因为finally块代码将执行:
try
{        
    conn.Open();

    throw new ArgumentException();
}
catch(SqlException ex)
{
}
finally
{
    conn.Dispose();
}

0

在编程中,有些代码片段需要无论前面的代码是否成功都要执行。通过使用Try/Catch/Finally语句,您可以从错误处理中获益。


0

0

Finally 确保无论 try 成功或失败,其中的内容都将被执行。在发生 catch 的情况下,不能保证最后的 //do something 中的所有内容都会被执行。


0
无论是否抛出异常,Finally块中的代码始终会执行。如果路径在catch中返回,则异常块后面的代码可能会执行,也可能不会执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接