C# 最后一块是没有意义的吗?

C# 最后一块是没有意义的吗?,c#,.net,try-catch-finally,C#,.net,Try Catch Finally,我在自学C#,我正在努力学习“尝试、捕捉”和“最终”。我正在使用的这本书讨论了finally块是如何运行的,而不管try块是否成功。但是,即使不是在finally中,在catch块之外编写的代码也不会运行吗?如果是这样的话,最终的目的是什么?这是本书提供的示例程序: class myAppClass { public static void Main() { int[] myArray = new int[5]; try {

我在自学C#,我正在努力学习“尝试、捕捉”和“最终”。我正在使用的这本书讨论了finally块是如何运行的,而不管try块是否成功。但是,即使不是在finally中,在catch块之外编写的代码也不会运行吗?如果是这样的话,最终的目的是什么?这是本书提供的示例程序:

class myAppClass
{
    public static void Main()
    {
        int[] myArray = new int[5];

        try
        {
            for (int ctr = 0; ctr <10; ctr++)
            {
                myArray[ctr] = ctr;
            }
        }
        catch
        {
            Console.WriteLine("Exception caught");
        }
        finally
        {
            Console.WriteLine("Done with exception handling");
        }
        Console.WriteLine("End of Program");
        Console.ReadLine();            
    }
}
类myAppClass
{
公共静态void Main()
{
int[]myArray=新的int[5];
尝试
{

对于(int ctr=0;ctr来说,finally块非常有用,因为它允许您进行资源清理,否则,如果遇到异常,就不会发生这种情况

e、 g.(伪文本)


finally块的整个要点是结束您开始的内容。假设您在try块中打开了一个缓冲区,那么您应该在finally中关闭它。这是必要的,这样即使出现异常并且您退出try,资源也会正确关闭

try
{
    //Do Something
}
catch
{
    //Catch Something
}
finally
{
    //Always Do This
}
很多时候,catch语句中的代码要么重新抛出异常,要么中断当前函数。如果没有finally块,“Always Do this”调用将不会执行,即如果catch语句中的代码发出返回或抛出新异常


finally块执行在任何情况下都需要运行的代码。例如,您经常重新引发异常或转到其他代码。如果资源的清理代码不在finally块中,则不会执行该代码。您也可以将此代码放在catch块中,但在try块a之后将重复该代码纽约。

在这些场景中,
最终
非常有用:

try
{
    //Do something
}
catch (Exception e)
{
    //Try to recover from exception

    //But if you can't
    throw e;
}
finally
{
    //clean up
}
通常,您会尝试从异常中恢复或处理某些类型的异常,但如果您无法恢复或未捕获特定类型的异常,则会将异常抛出给调用方,但最终还是会执行

另一种情况是:

try
{
    //Do something
    return result;
}
finally
{
    //clean up
}
如果代码运行正常且未引发异常,则可以从
try
块返回,并释放
finally
块中的任何资源


在这两种情况下,如果您将代码放在
try
之外,它将永远不会被执行。

下面是一个简单的示例,说明在catch块之外编写的代码即使不在finally中也不会运行

try
{
    try { throw new Exception(); }
    finally { Console.WriteLine("finally"); }
    Console.WriteLine("Where am I?");
}
catch { Console.WriteLine("catched"); }
输出是

最后
抓住


请阅读

如果没有finally,请在try和catch中删除socket。我建议在此基础上检查!它很简单,并且有一个很好的示例。如果您的catch语句设计为抛出方法异常,finally块仍将执行。catch blo之外的任何内容ck不会。作为最佳实践,您不应该像这样捕获{
,因为这样会删除调用堆栈,但会捕获可以针对特定情况处理的特定故障。我将此称为“尝试隐藏”我看到一些开发人员使用它来隐藏错误,因为他们缺乏创建有问题或有挑战性的代码的技能,特别是不遵循良好实践的代码。
try
{
    try { throw new Exception(); }
    finally { Console.WriteLine("finally"); }
    Console.WriteLine("Where am I?");
}
catch { Console.WriteLine("catched"); }