C# C中的嵌套try finally#
为什么不执行“Console.WriteLine(“asdf”);”行?其他的都是。难道这不应该是因为我们不能跳出最终的范围吗C# C中的嵌套try finally#,c#,try-catch,C#,Try Catch,为什么不执行“Console.WriteLine(“asdf”);”行?其他的都是。难道这不应该是因为我们不能跳出最终的范围吗 static bool Func() { try { try { } finally { try { throw new ApplicationException(); }
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,需要解锁:文件属性->常规->解锁)