VB.NET中如何用Try-Catch替代Resume语句?代码改写求助
把VB.NET旧错误处理改写为Try-Catch的方案
要把旧的On Error GoTo错误处理转换成VB.NET的Try-Catch结构,关键是先理清原代码中Resume和Resume Done的逻辑,再用现代错误处理方式模拟它们的行为:
原代码逻辑拆解
先明确你原来的代码到底在做什么:
- 执行
Statement1和Statement2,只要其中任何一行出错,就跳转到ErrorHandler分支 - 如果参数
a等于"a",回到出错的那一行重新执行(这是Resume的核心作用) - 如果参数
a不等于"a",直接跳转到Done标签,退出当前方法(这是Resume Done的作用)
Try-Catch改写方案
在Try-Catch模型中,没有直接对应Resume(回到出错行重试)的语法——因为Try-Catch是块级错误处理,而On Error是行级的。我们可以用两种方式模拟原逻辑:
方案1:精确模拟单个语句重试(最贴近原逻辑)
如果Statement1和Statement2是独立的语句,我们可以给每个易出错的语句单独加Try-Catch,并用GoTo模拟回到出错行重试的行为:
Private Sub test(a As String) Dim index As String ' 处理Statement1的重试逻辑 RetryStatement1: Try Statement1 Catch ex As Exception If a.Equals("a") Then ' 模拟Resume:回到Statement1重新执行 GoTo RetryStatement1 Else ' 模拟Resume Done:直接退出方法 Exit Sub End If End Try ' 处理Statement2的重试逻辑 RetryStatement2: Try Statement2 Catch ex As Exception If a.Equals("a") Then ' 模拟Resume:回到Statement2重新执行 GoTo RetryStatement2 Else ' 模拟Resume Done:直接退出方法 Exit Sub End If End Try ' 原Done标签后的退出逻辑 Exit Sub End Sub
方案2:重试整个代码块(简化版)
如果不需要精确到单个语句重试,而是只要出错就重新执行整个Statement1和Statement2块,可以把它们放在带标签的Try-Catch里:
Private Sub test(a As String) Dim index As String RetryBlock: Try Statement1 Statement2 ' 如果执行成功,直接退出,不再重试 Exit Sub Catch ex As Exception If a.Equals("a") Then ' 模拟Resume:回到块开头重新执行所有语句 GoTo RetryBlock Else ' 模拟Resume Done:直接退出方法 Exit Sub End If End Try End Sub
关键说明
Resume Done的逻辑最简单,直接用Exit Sub替代即可——因为原代码中Done标签后就是退出方法的逻辑Resume的核心是重试出错的代码,由于Try-Catch没有行级重试的语法,我们用GoTo回到目标代码的起始点来模拟。虽然GoTo通常不推荐,但这里是为了精确匹配旧代码的行为- 如果你想避免
GoTo,也可以用Do...Loop循环实现重试逻辑,本质和GoTo是一致的
内容的提问来源于stack exchange,提问作者Ayush
相关产品推荐
相关产品推荐

