关于异常处理:c#中return关键字和finally关键字之间的关系

Relationship between return keyword and finally keyword in c#

本问题已经有最佳答案,请猛点这里访问。

我想知道"回车"和"finally"关键字之间的关系。如果有两个嵌套的finally块(如下所示),那么在代码块执行某些操作之后调用异常和返回关键字时的执行顺序和发生的情况是什么?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        try
        {
            try
            {

            }
            catch (Exception)
            {
                //do some stuff
                return;
            }
            finally
            {

            }
        }
        catch (Exception)
        {

        }
        finally
        {

        }


来自MSDN:

Typically, the statements of a finally block are executed when control leaves a try statement, whether the transfer of control occurs as a result of normal execution, of execution of a break, continue, goto, or return statement, or of propagation of an exception out of the try statement.

在您的示例中,两个finally块都将执行。先执行内部的,然后执行外部的。


无论发生什么,最终都将执行块。就返回而言,如果一个try块包含一个返回,它实际上会做一些事情,比如将它存储在某个变量中,并在最后一个块执行之后在末尾返回它。这样地:

1
2
3
4
5
6
try{
    return xyz; //(i.e, temp = xyz;)
    }
catch() {}
finally {}
return temp;


即使出现异常,finally块也将始终执行。要理解,请考虑以下代码

1
2
3
4
5
6
7
8
9
10
11
12
13
    try
    {
    //sql connection opened
    //execute a query ----> EXCEPTION OCCURRED HERE

//return the result
    }catch(Exception ex)
    {
    throw ex;
    }
    finally{
    //close the connection
    }

上面的代码演示了广泛使用的finally块场景。即使在执行查询时发生异常,也必须关闭与数据库的连接。

如果没有异常,那么也将执行finally块,然后返回结果。


如果内部try块中发生错误,控件将转到内部catch块,然后转到内部finally,然后转到外部finally,然后返回在内部catch块中执行的值。

尝试调试代码,您将获得流


最后总是被执行。无论是否有异常,最终块都将执行。在您的情况下,两个最终块都将被执行。


finally表示无论发生什么,都要运行这个代码。

无论是指return还是catch