2009-09-04 14 views
17

End Subに移動させるのではなく、Exit Subを使用して(処理後に)エラーハンドラから抜け出したいのはなぜですか?エラーハンドラ - Exit Sub vs. End Sub

私はそれが簡単だと確信しています。私は分かりません。助けてくれてありがとう。

例:通常、データベース接続または他のオブジェクトが安全に使用したり、例外前に作成したかどうか、(廃棄処分)をクリーンアップする必要があります、と宣言している場合

Public Sub SubA() 
On Error Goto ProcError 

    ''# other code 
    MsgBox FuncA() 

ProcExit: 
    Exit Sub 

ProcError: 
    MsgBox Err.Description 
    Resume ProcExit 
End Sub 

答えて

22

ProcExitラベルは、エラーが発生したかどうかにかかわらず、すべてのリソースを解放する場所です。たとえば:

+1

+1。そして、明らかに、リソースを閉じたり解放したりする必要がなければ、それを必要とせず、End Subに落とすことができます。 – MarkJ

+0

@ MarkJ:それはおそらくOKですが、私はそれに不快であると思います。エラーが真に "処理された"場合は、Exit Subで直ちに実行された場合でもProcExitに再​​開します。 – AnthonyWJones

+8

'ProcExit'の下の何かがエラーを起こした場合、これは無限ループを引き起こしませんか? –

1

、その後、あなたのエラーを返しますProcExitエントリポイントにコードを戻すことで、どちらの場合でもガベージコレクションを行うことができます。

Exit Subに落ちてプロシージャを中断した場合、プログラムのメモリに座っているインスタンス化されたオブジェクトがうまく構築される危険性があります。

+4

単語の選択肢が不適切です。 "あなたのガベージコレクションを行います"と "あなたのプログラムのメモリに座っている"。これにより、ルーチンの最後にNothingにすべてのローカルオブジェクト参照を宗教的に設定することが推奨されます。実際にオブジェクトとメモリは、参照カウントがゼロになるとすぐにVB6によって自動的にガベージコレクションされます。それらがローカル変数にある場合、これはExit Subで発生します。特定のリソースを明示的に解放する必要がある場合や、他の状態を復元する必要がある場合(たとえば、マウスポインタを砂時計から戻すなど)は、ごくわずかなケースで心配する必要があります。 – MarkJ

+0

フェアポイント。私が考えている私のVB6で最高のブラシ。最近、近代的なオブジェクト指向の楽しい言語に焦点をあてすぎています... –

+0

オブジェクトの参照を削除するだけでなく、スコープを終了するだけでなく、 "クリーンアップ"が必要な場合もあります。あなたは明示的なシャットダウン要求を必要とするアウトプロセスサーバーへの参照を保持している可能性があります(たとえば、Excelが終了呼び出しを待っているなど)。または、終了時にプロシージャのスコープ外で宣言された参照を解放することもできます。 – Bob77