On Error Resume Next如何处理If语句和循环中的错误

3
处理VBA代码中的错误时,通常会使用几种方法。其中一种方法是使用On Error Resume Next进行内联错误处理。然而,阅读现有问题 "VBA:On Error Resume Next 的工作时间有多长?" 后,我发现不清楚程序是否会继续执行下一行,或者程序是否会在下一个逻辑点继续执行。 MSDN对On Error Resume Next的功能描述如下:

指定当运行时错误发生时,控制转到紧接在错误发生语句后面的语句,执行将继续。访问对象时,请使用此形式而不是 On Error GoTo。

此外,(现已停用的)StackOverflow文档关于Resume关键字也指出了On Error Resume Next类似的功能。

Resume Next继续执行导致错误的语句后面的语句。如果在此之前未实际处理错误,则允许使用潜在无效数据继续执行,这可能会导致逻辑错误和意外行为。

这并没有清楚地说明错误处理行如何处理控制流语句的初始行中的错误。具体来说,如果错误发生在If .. Then .. Else .. End If语句的第一行中,程序会从If语句内部的第一行开始运行,还是会从End If语句后面的第一行开始运行?

1个回答

5

On Error Resume Next会导致程序在一个If .. Then语句或[While/Do/For/For Each]循环中继续执行,即使条件语句出现错误。

为了解决这个问题,我在一个空的Excel(2007)工作簿中创建了一对测试函数。然后我使用Excel电子表格来评估已知错误案例和已知成功案例的函数。


测试1 - If语句

Public Function Test1(intN As Integer) As String
On Error Resume Next
    Test1 = ""
    If 1 / intN > 0 Then
        Test1 = Test1 + "A"
    Else
        Test1 = Test1 + "B"
    End If
    Test1 = Test1 + "C"
End Function

当输入数字为 0 时,此函数将在第 If 1 / intN > 0 Then 行抛出错误,并对其他数字(如1-1)进行评估。

Test1(-1) -> BC
Test1(0)  -> AC
Test1(1)  -> AC

正如结果所示,Test1(0) 中的错误导致程序跳过了 If 1 / intN > 0 Then 这一行。在字符串中添加了 A,然后程序从 Else 跳到了 End If。字符 C 被添加到字符串中并结束了函数。

测试2 - [Do] 循环

Public Function Test2(intN As Integer) As String
On Error Resume Next
    Test2 = ""
    Do While 1 / intN > 0
        Test2 = Test2 + "A"
        intN = intN - 1
    Loop
    Test2 = Test2 + "C"
End Function

当输入数字为0时,此函数将在行Do While 1 / intN > 0抛出错误,在正整数时返回字符串AA..AC,在负整数时返回C

Test1(-1) -> C
Test1(0)  -> AC
Test1(1)  -> AAC

进入循环时,On Error Resume Next会导致程序跳过从Do While 1 / intN > 0Test2 = Test2 +“A”的代码,无论它在循环的哪个迭代中。每当intN = 0时,程序运行了包含在循环中的代码并且达到了intN = intN - 1,导致intN = -1而不再次执行循环代码。因此可以推断,在ForWhile循环的情况下,循环将以类似的方式操作,即在命中循环底部时,取下一行并返回。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接