首页 > 解决方案 > 为什么不能从 finally 块的内部跳转到外部?

问题描述

为什么不能从块的内部到外部进行跳转(break, continue, goto, ) (除了 via )?returnfinallythrow

标签: c#finally

解决方案


谁能解释一下技术原因?

不,因为没有技术原因。设计语言语义是完全有可能的,它允许一个分支离开 finally,而其他语言确实允许它。可能会有一些小困难,因为 IL 中分支可能出现的规则对于 try-protected 区域是不同的,但这些都很容易管理。

C# 不允许这种行为,因为如果语言有这个特性会更糟。从 finally 分支是一种不好的编程习惯,应该被禁止。

这样想吧。如果 finally 因为异常而运行,那么劫持与该异常相关的控制流是一个坏主意;finally 的延续应该是实现定义的行为,如果异常未处理,在这种情况下它可以做任何事情,或者它应该是处理异常的 catch 块。“取消”“进行中”异常的唯一方法是抛出另一个异常并允许对其进行处理。

如果由于异常而 finally 没有运行,那么您可以将所需的控制流放在 try-finally 块之后。

因此,允许从 finally 中分支出来要么是错误的,要么是不必要的。由于不需要从 finally 分支出来,而且这样做是一个坏主意,因此应该将其定为非法。


推荐阅读