最后不会在.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。
Finally
在background 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#“析构函数”)不应该依赖。
- Visual Studio跳转到下一个错误快捷方式?
- 为什么使用C#类System.Random而不是System.Security.Cryptography.RandomNumberGenerator?
- 如果我在使用声明结束之前返回,会发生什么情况? 这个configuration会被调用吗?
- CallContext.LogicalGetData VS. CallContext.GetData
- testing对象是C#中的genericstypes
- string转义成XML
- 如何使用鼠标光标在屏幕上最大化WPF窗口?
- 如何遍历c#.net中目录中的所有文件?
- 有没有一种方法来导航到一个接口的方法的真正实现?