2012-01-27 339 views
3

我需要解决一些旧的VB6代码,我对使用“On Error”感到困惑。在下面的例子中,如果我围绕特定的代码行,我想用On Error GoTo和ErrHandler1来测试,那是测试的唯一行。或者如果包含在同一个Sub中,那么是否包含零除?关于VB6中的错误处理以及On Error GoTo的使用

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 

谢谢。

回答

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) 
+0

感谢您的解释! – JimDel 2012-01-27 16:47:39

+0

+1。该文件解释这很清楚... ... http://msdn.microsoft.com/en-us/library/aa266173(v=vs.60).aspx – MarkJ 2012-01-27 16:53:09

+3

错误 - 除零除只处理如果MkDir操作不会抛出错误 – 2012-01-27 16:58:22

4

零的划分仅如果MkDir不会导致抛出错误,则处理。

这表示它将循环到ErrHandler1标签,并且将再次除以零产生另一个错误,这将不会被处理,因为您不能在另一个错误处理程序中嵌套错误处理。

的代码,因此没有意义,因为它代表,错误处理程序应该下来的代码进一步移动(下面的出口子),以确保它仅被调用一次:

On Error Goto ErrHandler1 

    'some code 

    exit sub 
ErrHandler1: 
    msgbox "There was an error" 

如果你想处理这两种操作分开,你可以这样做:

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) 
+0

谢谢马特。现在都开始有意义了。 – JimDel 2012-01-27 17:39:56

1

一个转到错误处理程序是一个程序的顶部是良好的编程风格,应该是错误的处理对于大多数程序的最低金额。但是,它比检查可能导致错误的代码行之后的错误更不灵活。当在相当简单的过程中添加错误处理时,我使用On Error GoTo ...语句和例程底部的catch-all错误处理程序。

On Error GoTo procErrorHandler 

    If Not Exists(BaseDirectory + "\ARCHIVE") Then 
     MkDir BaseDirectory + "\ARCHIVE" 
    End If 

    intvalue1 = 12 
    intvalue2 = 0 
    intvalue3 = intvalue1/intvalue 

ProcExit: 
    Exit Sub 

procErrorHandler: 
    Call MsgBox("There was an error in the procedure. Error " & CStr(Err.Number) & ", " & Err.Description, vbExclamation, App.Title) 
    Resume ProcExit ' A chance to do any cleanup needed 

我不是多转到语句的粉丝,因为它使代码难以阅读和遵守。在我正在执行几个步骤的过程中,我想返回一个更准确地描述代码出错的位置的错误,或者在可能有机会从错误中恢复并继续的情况下,我禁用全部错误处理类型并在关键步骤后检查Err.Number属性。如果我修改Matt的错误处理,我会以这种方式编写程序。

On Error Resume Next 

    If Not Exists(BaseDirectory + "\ARCHIVE") Then 
     MkDir BaseDirectory + "\ARCHIVE" 
    End If 
    ' check for errors making the directory 
    If Err.Number <> 0 Then 
     Call MsgBox("Error making directory - " & Err.Number & vbCrLf & Err.Description, vbExclamation, App.Title) 
    End If 

    intvalue1 = 12 
    intvalue2 = 0 
    intvalue3 = intvalue1/intvalue 
    ' check for errors getting intvalue3 
    If Err.Number <> 0 Then 
     Call MsgBox("Error doing arithmetic - " & Err.Number & vbCrLf & Err.Description, vbExclamation, App.Title) 
    End If 

Exit Sub