例えば、フォームにレコード を削除するためのボタンがあり、クリックされたときの処理を次のように記述したとする。
Private Sub btnDelete_Click() DoCmd.RunCommand acCmdDeleteRecord End Sub
エラー処理を記述してないので、削除ボタンを押したときに「いいえ」を選択すると、
実行時エラーのエラーのダイアログが表示される。
エラー処理
エラーをキャッチして、エラー番号とエラー内容を表示するように変更するなら、
Private Sub btnDelete_Click() On Error GoTo Err_Handler DoCmd.RunCommand acCmdDeleteRecord Exit Sub Err_Handler: MsgBox Err.Number & " : " & Err.Description End Sub
正常に処理されたとき、エラー処理に突入しないように Exit Sub の記述を忘れずに。
先ほどと同じ操作をすると、同じ内容がメッセージボックスに表示される。
エラー処理の分岐
ところで、ユーザに上記のメッセージを見せる必要はないので、エラーの内容によってエラー処理を変えたい。この場合、先ほどのエラー番号で処理を分ける。
Private Sub btnDelete_Click() On Error GoTo Err_Hander DoCmd.RunCommand acCmdDeleteRecord Exit Sub Err_Handler: If Err.Number = 2501 Then Exit Sub Else MsgBox Err.Number & "/" & Err.Description End If End Sub
Java ばかりいじっていたとき、エラー番号でトラップするのを見たときびびったけど ^^;
ちなみに Chapter 09 例外処理 - @IT によると、
VB.NETでは、On Error Gotoは「非構造化例外処理」という名前で呼ばれる。
後処理がある場合
もし、次のような要件がある場合は、
- エラーの内容に応じて処理をしたい
- 正常、エラーを問わず後処理が必要
Private Sub btnDelete_Click() On Error GoTo Err_Handler DoCmd.RunCommand acCmdDeleteRecord Finally: ' 後処理 Exit Sub Err_Handler: If Err.Number = 2501 Then ' このエラー独自の処理 Else MsgBox Err.Number & "/" & Err.Description End If Resume Finally End Sub
(cf. Access の VBA でトランザクション処理 – CSV ファイルからデータの登録)
処理がシンプルなときは Resume Next でもいいけれど、バグを誘発しそうなので Resume ラベル名 を使うことにしようかな。
0コメント:
コメントを投稿