| 不知你是否见过 try { } finally { }代码中,try块留空,而只往finally中写代码的情况呢?这种写法有其特殊的目的。 本文就来说说这种不一样的写法。 
 你可以点开这个链接查看 Exception类,在里面你可以看到一段异常处理的代码非常奇怪: 
 神奇之处就在于,其 try块是空的,重要代码都放在finally中。那为什么会这么写呢? 在代码注释中的解释为:  
 We do this inside a finallyclause to ensureThreadAbortcannot be injected while we have taken the lock. This is to prevent unrelated exception restorations from getting blocked due to TAE. 翻译过来是: 在 finally子句中执行此操作以确保在获取锁时无法注入ThreadAbort。这是为了防止不相关的异常恢复因 TAE 而被阻止。 也就是说,此方法是为了与 Thread.Abort对抗,防止Thread.Abort中断此处代码的执行。Thread.Abort的执行交给 CLR 管理,finally的执行也是交给 CLR 管理。CLR 确保finally块执行的时候不会被Thread.Abort阻止。 代码在 .NET Core 和 .NET Framework 中的实现完全一样: 
 你可以在 这里 查看 .NET Framework 版本,在这里 查看 .NET Core 的版本。 
 参考资料原文地址: https://walterlv.com/post/empty-try-block.html 作者:吕毅   |