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)
谢谢.
除以零将被包含和处理,它可能会在您的样本中创建一个循环...
正确的方法就是这样
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不会引发错误时,才会处理除零.
这表示它将循环到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)