不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的。
本文就来说说这种不一样的写法。
你可以点开这个链接查看 Exception 类,在里面你可以看到一段异常处理的代码非常奇怪:
神奇之处就在于,其 try 块是空的,重要代码都放在 finally 中。那为什么会这么写呢?
在代码注释中的解释为:
We do this inside a finally clause to ensure ThreadAbort cannot 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
作者:吕毅
|