2012-01-27 502 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