c# - 为什么不能从 finally 块的内部跳转到外部?
问题描述
为什么不能从块的内部到外部进行跳转(break
, continue
, goto
, ) (除了 via )?return
finally
throw
解决方案
谁能解释一下技术原因?
不,因为没有技术原因。设计语言语义是完全有可能的,它允许一个分支离开 finally,而其他语言确实允许它。可能会有一些小困难,因为 IL 中分支可能出现的规则对于 try-protected 区域是不同的,但这些都很容易管理。
C# 不允许这种行为,因为如果语言有这个特性会更糟。从 finally 分支是一种不好的编程习惯,应该被禁止。
这样想吧。如果 finally 因为异常而运行,那么劫持与该异常相关的控制流是一个坏主意;finally 的延续应该是实现定义的行为,如果异常未处理,在这种情况下它可以做任何事情,或者它应该是处理异常的 catch 块。“取消”“进行中”异常的唯一方法是抛出另一个异常并允许对其进行处理。
如果由于异常而 finally 没有运行,那么您可以将所需的控制流放在 try-finally 块之后。
因此,允许从 finally 中分支出来要么是错误的,要么是不必要的。由于不需要从 finally 分支出来,而且这样做是一个坏主意,因此应该将其定为非法。
推荐阅读
- html - 如何在导航菜单中的 CSS 中解决这些问题?
- less - LESS 中的媒体查询和 if else 语句
- github - 您可以自定义贡献者在您的 Github 项目问题选项卡上看到的内容吗?
- javascript - 将对象添加到特定的 json PHP 数组
- android - 从 sqlite 数据库中删除表中的整行
- android - 当 taskAffinity 活动正在调用 finish() 但它不会关闭最近的应用程序
- azure - 对 ASP.NET Web API 的 Azure 静态网站身份验证
- python - 如何在不同的 kdeplot(seaborn 2D plot)中保持相同的比例/级别?
- unity3d - Unity2D分层多个画布'
- unit-testing - 运行货物测试时如何抑制多个线程的输出?