条件时的最后不执行中的一种。净尝试。。最后块
-
02-07-2019 - |
题
基本上我听说某些条件下将引起的。净吹过去的最后块。有没有人知道那些条件吗?
解决方案
两种可能性:
最终区块不会被执行,当有一个 StackOverflowException
由于没有间堆即使执行任何更多的代码。它也不会叫的时候有一个 ExecutionEngineException
, ,这可能引起呼叫的 Environment.FailFast()
.
其他提示
除非CLR爆炸并且因ExecutingEngineException而崩溃(我在.net 1.1天中看到了一些只有适当数量的COM Interop :) ..我认为最终应该总是执行。
你可能会遇到这样的情况:try块中的代码导致在输入try块之前抛出SecurityException(而是在调用contains方法时抛出异常(参见 http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx )),在这种情况下,你甚至都不会进入try块,因此finally块中的代码永远不会被调用。
其他可能性包括StackOverflowException和ExecutingEngineException。
最后
块可能无法执行。但是,这取决于后台线程
上的主前台线程
的完成执行,它甚至在后台线程
的完整执行之前终止后台线程
操作。
class Program
{
static void Main(string[] args)
{
Program prgm = new Program();
Thread backgroundThread = new Thread(prgm.CheckBgThread);
backgroundThread.IsBackground = true;
backgroundThread.Start();
Console.WriteLine("Closing the program....");
}
void CheckBgThread()
{
try
{
Console.WriteLine("Doing some work...");
Thread.Sleep(500);
}
finally
{
Console.WriteLine("This should be always executed");
}
}
}
还有Application.Exit方法。
最后一个块之后的代码和外部作用域中的代码都不会先执行finally块而不执行finally块(finally块中的异常可能导致它过早退出,在这种情况下执行将从终结者到外部范围)。如果finally块之前的代码卡在无限循环或永不退出的方法中,或者执行上下文被完全销毁,则finally块将不会执行。
请注意,依赖于finally块是合适的,与“Finalize”不同。方法(或C#“析构函数”),不应该被依赖。