我们在这个论坛上看到了许多关于try-catch-finally
和try-finally
结构的问题。
答案的数量会增加问题的数量,所以我的问题也很少。
这里有一个链接到微软解释"最后尝试"结构。我已经读过了!
在以下文章中写道:
在已处理的异常中,保证关联的finally块要运行。但是,如果未处理异常,则执行finally块取决于异常解除操作的方式已触发。这反过来又取决于你的电脑是如何设置的。
-
我是否正确理解在
try-catch-finally
构造中finally
将始终执行?(不包括Environment.FastFail()
)我在这个论坛上读到过
StackOverFlowException
(finally
块在这种情况下不执行),但当我throw
它时,finally
块被执行。那么StackOverFlowException
是怎么回事呢? -
为什么不调用
finally
块?(在下面的代码中)? -
对于哪些情况,我们通常使用
try-finally
? -
finally
块取决于什么PC设置?
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
try
{
throw new Exception();
}
finally
{
Console.WriteLine("finally");
Console.ReadKey();
}
}
}
}
-
是的,在大多数情况下,如果你不使用
Environment.Exit(0)
或Application.Exit()
之类的东西中止执行(就像他回答中提到的普通人),那么finally块总是会被执行。对于StackOverFlowException和其他深度应用程序崩溃,它无法运行,因为当堆栈已满时,该线程中没有剩余内存来执行任何正常操作。因此,当您自己抛出异常时,没有真正的完整堆栈,应用程序可以继续运行。
-
如果顶级上存在未处理的异常,则不会在调试器中调用finally块,因为调试器会立即关闭,因为没有顶级异常处理程序。请参阅此答案以获得更深入的解释。如果你在没有附加调试器的情况下运行应用程序,那么finally块就会被调用——这要归功于bommelding。
-
每次需要确保正确清理时,都要使用finally块。请参阅此答案以获得更深入的解释。
-
这是一个棘手的问题,我认为这是为了描述电脑设置的影响,比如病毒扫描仪在程序试图造成缓冲区溢出或类似的可能危急情况时终止程序。类似地,finally块的执行可以通过数据执行阻止或其他安全特征来阻止。
1.我是否正确地理解了在try-catch finally中,构造finally总是会被执行?(不包括
Environment.FastFail()
)
在两种独特的情况下,返回后将不会调用finally块:如果首先调用System.exit()
,或者如果VM崩溃。
2.为什么不调用
finally
块?(在下面的代码中)?
阅读此处:finally块是否可以被中断/挂起?
- 对于哪些情况,我们通常使用try finally
try{} finally{}
应用于无法处理异常但需要清理资源的情况。
或者,在我们的程序中发生异常后,最好显示一些内容并优雅地退出
1-取决于具体情况。使用finally块的想法是清理try块中分配的资源。即使try块中发生异常,您也可以在finally块中运行代码。但是,finally块保证在已处理的异常中运行。如果未处理异常,则finally的执行取决于异常展开操作的触发方式。
2-由于未处理异常,因此未调用您的finally。Microsoft文档指出:"通常,当未处理的异常结束应用程序时,finally块是否运行并不重要。但是,如果finally块中的语句即使在这种情况下也必须运行,则一种解决方案是在try-filly语句中添加catch块。"https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-finally查看已处理异常和未处理异常之间的区别。
阅读更多关于这个问题为什么在C#中使用finally?
来源https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-finallyhttps://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch-finally