Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中的嵌套try finally#_C#_Try Catch - Fatal编程技术网

C# C中的嵌套try finally#

C# C中的嵌套try finally#,c#,try-catch,C#,Try Catch,为什么不执行“Console.WriteLine(“asdf”);”行?其他的都是。难道这不应该是因为我们不能跳出最终的范围吗 static bool Func() { try { try { } finally { try { throw new ApplicationException(); }

为什么不执行“Console.WriteLine(“asdf”);”行?其他的都是。难道这不应该是因为我们不能跳出最终的范围吗

static bool Func()
{
    try
    {
        try
        {
        }
        finally
        {
            try
            {
                throw new ApplicationException();
            }
            finally
            {
                Console.WriteLine("asd");
            }

            Console.WriteLine("asdf");
        }
    }
    finally
    {
        Console.WriteLine("asd");
    }
}

在finally(或catch)块中引发的异常将取消该finally(或catch)块的其余部分。

finally块仅保证(至少大部分保证,请参阅下面的MSDN摘录)在try块引发异常时将输入这些异常。如果在finally块中抛出异常,该异常将导致控件离开finally块,并且finally块中的其余代码将不会执行

在您的例子中,未执行的行发生在同一finally块中的异常之后,因此它被跳过

发件人:

finally块可用于清理任何可用的资源 在try块中分配,用于运行任何必须执行的代码 即使try块中发生异常。通常情况下 当控件离开try时,执行finally块的语句 语句,是否由于 正常执行,执行中断继续转到返回 语句,或从try语句传播异常

在已处理的异常中,关联的finally块得到保证 待运行。但是,如果未处理异常,则 最后块取决于异常展开操作的方式 触发。这又取决于计算机的设置方式。 有关详细信息,请参阅CLR中未处理的异常处理


注:参考MSDN杂志2008年9月号的一篇文章。所有2008年及以前版本的MSDN Magazine都只能作为.chm文件提供,并且在查看之前需要下载。

因为异常被抛出到finally块中,因此它会导致控制权落入finally块。因此“asdf”WriteLine永远不会执行。

错误发生在第三个try块内,导致其相应的finally被执行。但是,这会导致它从当前的finally中出错,并被原始的try-finally块捕获。

因为您已插入try块,它将使用控制台执行finally块。WriteLine(“asd”)并退出到outer try catch

我认为最好的解决方法是使用代码和下图

当我对跨不同主机部署的代码使用try-finally块时,我发现: 在try块上没有引发异常时

某些Windows平台始终执行finally块和 一些平台从未执行finally块

我的finally块包含关闭错误日志的指令,如果未能执行finally块,则在退出时总会引发另一个异常,留下的信息仅用于查找导致错误的原因。
对于我的应用程序,try finally块的麻烦比它们的价值还多

相关:+1的真棒图片。。。告诉一千个字。我认为它被最外面的try块捕获,最终什么都没有捕获。
“最终块仅保证*snip*,如果try块抛出异常,它们将被输入”
你是说,最终块仅在try块退出后才进入?(捕捉块在异常上执行)这是真的。我试图指出它们是如何处理异常的,并且它们不能保证它们将全部运行,但它们至少会被输入。(要打开chm,需要解锁:文件属性->常规->解锁)