最后不会在.net中执行的条件try..finally block

基本上我听说某些条件会导致.net吹过最后的块。 有谁知道这些条件是什么?

两种可能性:

  • StackOverflowException
  • ExecutionEngineException

当有StackOverflowException时,finally块不会被执行,因为堆栈上没有空间来执行更多的代码。 当有一个ExecutionEngineException ,它也不会被调用,这可能是由于调用Environment.FailFast()

除非CLR爆发,并与ExecutingEngineException(我已经看到了.net 1.1天只有适量的COM互操作:) :)我终于应该总是执行。

你可以得到一个情况,try块中的代码会导致在inputtry块之前抛出一个SecurityExceptionexception(而不是在调用了包含方法时抛出exception)(请参阅http://msdn.microsoft.com/en-us /library/fk6t46tz(VS.71).aspx )),在这种情况下,你甚至不会inputtry块,所以finally块中的代码永远不会被调用。

其他可能性包括StackOverflowException和ExecutingEngineException。

Finallybackground thread阻塞可能无法执行。 但是,它依赖于main foreground thread的完成执行,甚至在background thread完成执行之前终止background thread操作。

 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代码块中的exception可能会导致它过早退出,在这种情况下,执行会从终结器跳出到外部范围)。 如果finally块之前的代码被卡在无限循环或永不退出的方法中,或者执行上下文被完全销毁,finally块将不会执行。

请注意,依赖于finally块是正确的,不像“Finalize”方法(或C#“析构函数”)不应该依赖。