web-dev-qa-db-ja.com

エラーハンドラ-終了サブと終了サブ

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
20
RNamo

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
26
AngryHacker

通常、安全に使用するか例外の前に作成するかに関わらず、データベース接続または他のオブジェクトをクリーンアップ(破棄)する必要があると宣言している場合、エラー処理コードをProcExitエントリポイントに戻すと、どちらの場合でもガベージコレクション。

Exit Subに落ちてプロシージャから脱退すると、プログラムのメモリ内にただ座っているインスタンス化されたオブジェクトの不愉快なビルドアップを抱える危険があります。

1
Phil.Wheeler