2012-01-27 11 views
3

いくつかの古いVB6コードのトラブルシューティングが必要で、「On Error」の使用について混乱します。下のサンプルで、On Error GoToとErrHandler1でテストしたい特定のコード行を囲むと、それはテスト済みの行だけです。または、同じSubにある場合、Zeroによる除算が含まれますか?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

+0

+1。ドキュメントはこれを非常にはっきりと説明しています... http://msdn.microsoft.com/en-us/library/aa266173(v=vs.60).aspx – MarkJ

+3

間違っています - ゼロによる除算は、MkDir操作が行う場合にのみ処理されますエラーをスローしません –

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

Thanks Matt。それは今、すべて理にかなっています。 – JimDel

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 
関連する問題