当"On error resume next"激活时,错误(运行时错误5)不会升起

CBR*_*F23 1 error-handling vba runtime-error runtime

我已经提供了我正在使用的实际代码.我试图处理的确切条件是strCurrentRev作为零长度字符串的参数.(例如strCurrentRev="")

如果我注释掉错误处理语句,尝试在零长度字符串上执行ASC方法会抛出Run-Time Error 5"无效的过程调用或参数".
如果我然后检查err.Number它= 5.

如果我尝试使用on error resume nextactive 运行完全相同的语句,则不会引发任何错误,例如在执行后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
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 6

你没有使用合适的工具来完成工作.应该处理运行时错误,而不是在地毯下推送(因为这就是On Error Resume Next- 执行愉快地继续,好像什么也没发生).

您需要首先尝试避免引发该错误.是什么造成的?

lngX=Asc(strCurrentRev) 
Run Code Online (Sandbox Code Playgroud)

你已经知道发生了什么:

我正在尝试处理的确切条件是strCurrentRev参数作为零长度字符串.

那么,处理这个问题的正确方法是strCurrentRev Asc函数传递给函数之前验证它的长度,如果给它一个空字符串,你知道它将引发运行时错误#5!

If strCurrentRev <> vbNullString Then
    'calling Asc(strCurrentRev) here will not fail!
End If
Run Code Online (Sandbox Code Playgroud)

  • @ CBRF23别误会我的意思 - 我几乎没有使用过'GoTo`声明.我诚挚地邀请您将一些工作代码带到[codereview.se](当然包括更多的上下文代码),我确信这个程序的完整代码审查完整的荣耀(或者整个模块甚至!)比这个小评论讨论更有用. (3认同)
  • @ Mat'sMug我之前从未见过Code Review.很酷.当我把它们靠近时,我会在那里发布一些项目.这个项目仍处于发展的粗略阶段,我现在没有足够的时间来完成清理工作.我有一些模块,我知道可能会更好,并希望得到一些输入! (3认同)