【发布时间】:2015-07-18 06:42:24
【问题描述】:
我在下面提供了我正在使用的实际代码。
我要处理的确切条件是将 strCurrentRev 参数作为零长度字符串。 (例如strCurrentRev="")
如果我注释掉错误处理语句,尝试对长度为零的字符串执行 ASC 方法会抛出 Run-Time Error 5 用于“无效的过程调用或参数”。
如果我然后检查 err.Number 它是 = 5。
如果我尝试在 on error resume next 处于活动状态的情况下运行完全相同的语句,它不会引发任何错误,例如执行后err.number 总是 = 0。
如果 on error resume next 处于活动状态,并且您尝试从即时窗口执行 ASC 方法(例如,键入 asc(strcurrentrev) 并点击 Enter),它将引发运行时错误并将 err.number 属性设置为5.
我以前从未经历过这种情况。为什么让on error resume next 处于活动状态会导致错误在正常执行中不出现???
Function NextRevLetter(strCurrentRev As String) As String
'This function returns the next revision letter given an existing revision letter.
'Declare variables
Dim lngX As Long
Dim strX As String
Dim strY As String
'First, check if we are dealing with rev A-Z or AA-ZZ
If Len(strCurrentRev) <= 1 Then
'Check that we can work with revision letter ***THIS IS WHERE I AM HAVING A PROBLEM!***
On Error Resume Next
Err.Clear
'Procedure call to flag errors with ASC method without changing any values
lngX=Asc(strCurrentRev)
lngX=0
On Error GoTo 0
If Err.Number > 0 Then
Err.Clear
If Len(strCurrentRev) < 1 Then
'No revision specified, assign first revision"
strCurrentRev = "-"
Else
MsgBox "The revision letter specified is not compliant. The next revision letter cannot be determined.", vbOKOnly, "Error: Revision does not follow rules"
'Return the existing revision (no change) and exit function
NextRevLetter = strCurrentRev
Exit Function
End If
End If
'Code continues - not important for this question...
Exit Function
【问题讨论】:
-
提示:当
On Error Resume Next处于活动状态时,将永远引发no error。这是指令的目的!避免它,除非你知道你在做什么;-) -
@Mat's Mug,您的评论不正确。在
On Error Resume Next处于活动状态时仍然会引发错误ARE,但是该语句告诉运行时环境忽略错误并继续执行。 -
当然是提出来的,你可以查看
Err.Number。但对于普通人来说,可能更容易理解On Error Resume Next将运行时错误隐藏在地毯下——这绝不是一个错误的说法。 -
嗯。不,不,这不是以不同方式捕获和处理特定错误的最佳方法。一点也不。不不不不。
-
@CBRF23 我同意这是一个“强大的工具” - 权力越大,责任越大。首先要做的是首先avoid executing code that can fail in known ways。
标签: vba error-handling runtime runtime-error