对VB6中的错误处理和使用On Error GoTo感到困惑

Jim*_*Del 3 vb6 error-handling

我需要解决一些旧的VB6代码,我对使用"On Error"感到困惑.在下面的示例中,如果我围绕要使用On Error GoTo和ErrHandler1进行测试的特定代码行,那么该行是经过测试的唯一行.或者,如果在同一个Sub中,则除以零除以?

On Error GoTo ErrHandler1
If Not Exists(BaseDirectory + "\ARCHIVE") Then _
   MkDir BaseDirectory + "\ARCHIVE"

ErrHandler1:
   Call MsgBox(Err.Number & vbCrLf & Err.Description, vbExclamation, App.Title)


intValue1 = 12
intValue2 = 0
intValue3 = intValue1 / intValue
Run Code Online (Sandbox Code Playgroud)

谢谢.

Max*_*Max 8

除以零将被包含和处理,它可能会在您的样本中创建一个循环...

正确的方法就是这样

On Error GoTo ErrHandler1
If Not Exists(BaseDirectory + "\ARCHIVE") Then _
   MkDir BaseDirectory + "\ARCHIVE"

On Error Goto 0 'this will un-hook you error handler

intValue1 = 12
intValue2 = 0
intValue3 = intValue1 / intValue  'this will be an un-managed error

Exit Sub 'this make sure that msgbox is shown only when the error happens

ErrHandler1:
   Call MsgBox(Err.Number & vbCrLf & Err.Description, vbExclamation, App.Title)
Run Code Online (Sandbox Code Playgroud)

  • 错误 - 只有在MkDir操作没有抛出错误时才会处理除零 (3认同)

Mat*_*lko 5

只有当MkDir不会引发错误时,才会处理除零.

这表示它将循环到ErrHandler1标签,并且将再次从除以零生成另一个错误,这将无法处理,因为您无法在另一个错误处理程序中嵌套错误处理.

因此代码没有意义,错误处理程序应该进一步向下移动代码(在exit子下面),以确保它只被调用一次:

On Error Goto ErrHandler1

    'some code

    exit sub
ErrHandler1:
    msgbox "There was an error"
Run Code Online (Sandbox Code Playgroud)

如果要单独处理这两个操作,可以执行以下操作:

On Error GoTo ErrHandler1
If Not Exists(BaseDirectory + "\ARCHIVE") Then _
   MkDir BaseDirectory + "\ARCHIVE"

DoCalc:
    On Error GoTo Errhandler2
    intvalue1 = 12
    intvalue2 = 0
    intvalue3 = intvalue1 / intvalue

    Exit Sub

ErrHandler1:
   Call MsgBox("Error making directory - " & Err.Number & vbCrLf & Err.Description, vbExclamation, App.Title)
   Resume DoCalc:

Errhandler2:
    Call MsgBox("Error doing arithmetic - " & Err.Number & vbCrLf & Err.Description, vbExclamation, App.Title)
Run Code Online (Sandbox Code Playgroud)