try catch和finally块的执行顺序

Nov*_*Net 6 c#

我对try,catch和finally执行的顺序感到很困惑.

我也想知道我应该何时使用try catch块以及我应该在try catch块中放置什么,我还想知道是否有一些异常出现在try块中然后如果对应于try块采取了一个动作然后执行哪一个第一次捕获或最后(总是要执行),并且在执行这两个之后确实控制返回尝试阻止或者它永远放弃它.

icy*_*com 6

如果你有(注意:这不是有效的C#,请参阅下面的有效示例):

try {
   // ... some code: A
} catch(...) {
   // ... exception code: B
} finally {
   // finally code: C
}
Run Code Online (Sandbox Code Playgroud)

代码A将被执行.如果一切顺利(即在执行A时没有异常被抛出),它将最终进入,因此代码C将被执行.如果在执行A时抛出异常,那么它将转到B然后最终转到C.

例如,这是来自http://msdn.microsoft.com/en-us/library/dszsf989.aspx的有效C#代码块:

public class EHClass
{
    void ReadFile(int index)
    {
        // To run this code, substitute a valid path from your local machine
        string path = @"c:\users\public\test.txt";
        System.IO.StreamReader file = new System.IO.StreamReader(path);
        char[] buffer = new char[10];
        try
        {
            file.ReadBlock(buffer, index, buffer.Length);
        }
        catch (System.IO.IOException e)
        {
            Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);
        }
        finally
        {
            if (file != null)
            {
                file.Close();
            }
        }
        // Do something with buffer...
    }
}
Run Code Online (Sandbox Code Playgroud)

使用try/catch/finally的原因是为了防止程序在某些代码中出现错误时失败(上例中的A).如果出现问题,您可以使用catchpart来捕获问题并执行一些有用的操作,例如通知用户,将异常记录到日志文件中,再试一次或尝试一些您认为可能有用的东西而不是您最初尝试的东西.

finally用于确保执行某些清理.例如在A中,您可能会尝试打开文件并阅读它.如果打开成功,但读取失败,则会打开一个打开的文件.在这种情况下你想要的是关闭它,你将在finally块中执行 - 这个块总是被执行,保证关闭文件.

看看这里了解更多信息:


And*_*per 5

try ... catch 块用于捕捉异常。在try块中放置您期望的代码可能会引发异常。

如果没有异常发生,则try块中的代码按预期完成。如果有一个finally块,那么接下来将执行。

如果确实发生了异常,则执行跳转到第一个匹配catch块的开头。一旦该代码完成,就会执行 finally 块(如果存在)。执行不返回try块。