End Subに移動させるのではなく、Exit Subを使用して(処理後に)エラーハンドラーから抜け出すのはなぜですか。
簡単だと思います。分かりません。助けてくれてありがとう。
例:
Public Sub SubA()
On Error Goto ProcError
''# other code
MsgBox FuncA()
ProcExit:
Exit Sub
ProcError:
MsgBox Err.Description
Resume ProcExit
End Sub
ProcExitラベルは、エラーが発生したかどうかに関係なく、すべてのリソースを解放する場所です。例えば:
Public Sub SubA()
On Error Goto ProcError
Connection.Open
Open File for Writing
SomePreciousResource.GrabIt
ProcExit:
Connection.Close
Connection = Nothing
Close File
SomePreciousResource.Release
Exit Sub
ProcError:
MsgBox Err.Description
Resume ProcExit
End Sub
通常、安全に使用するか例外の前に作成するかに関わらず、データベース接続または他のオブジェクトをクリーンアップ(破棄)する必要があると宣言している場合、エラー処理コードをProcExitエントリポイントに戻すと、どちらの場合でもガベージコレクション。
Exit Subに落ちてプロシージャから脱退すると、プログラムのメモリ内にただ座っているインスタンス化されたオブジェクトの不愉快なビルドアップを抱える危険があります。