来自VB.NET中的Try / catch块的GOTO

时间:2014-02-19 10:59:46

标签: vb.net try-catch goto

是的,我知道GOTO错了,每次使用它都会导致小猫死亡;)还有一件事让我很好奇:

如果我在try / catch块中使用GOTO

,该怎么办?
Try
...some code...
Catch
...some code... 
  GoTo Label1
End Try
...some more code to be skipped if error
Label1:
...rest of code...

我是否正确理解try / catch块永远不会在程序中关闭并且可能会导致问题?或者不是?

似乎还有一些OnError GoTo命令,但我对它没有多少经验。也许我的代码可以用它重写?

2 个答案:

答案 0 :(得分:4)

  

我是否正确理解try / catch块永远不会被关闭

不,try / catch块将因您离开而关闭。 It is okay to jump out of the try/catch block

但是,代码应该重写为:

Try
  ...some code...
  ...some more code to be skipped if error
Catch
  ...some code... 
End Try

...rest of code...

答案 1 :(得分:3)

了解一下.NET框架内部结构可能会有所帮助:

  

CLI通过异常对象和受保护的代码块支持异常处理。

(CLI =公共语言基础设施)

  

在CLI中,方法可以定义一系列被称为 protected 的CIL指令。这称为 try块。然后,它可以将一个或多个处理程序与该try块相关联。如果在try块中的任何位置执行期间发生异常,则会创建描述问题的异常对象。然后CLI接管,将控制从抛出异常的点转移到愿意的代码块    处理这个例外。

这一切都是以声明的方式完成的。所以,基本上,TryCatchEnd Try等项目不会作为指令发出 - 编译器会说"如果是异常在这个指令范围内发生,这里是可能的跳转到"的处理程序。并且只有在发生异常时才会查询此信息。所以你关注的是:

  

try / catch块永远不会关闭

不是有效的,因为离开受保护区域的一种机制是......(请滚筒)......移动到该指令范围之外。 如何完成这一点并不重要 - 它可能只是通过运行受保护范围的末尾,或通过GOTO,或通过例外。


前两个引用来自MS Partition I(第12.4.2节)和MS Partition II(第19节)文件可从ECMA C# and Common Language Infrastructure Standards

下载

分区第12.4.2节我还说:

  

受保护的区域,关联处理程序的类型以及关联处理程序的位置和(如果需要)   用户提供的过滤器代码通过与每个方法相关联的异常处理程序表进行描述