エラー処理
プログラミングを進める際に大きな問題となるのが、エラーに対する修正タスクです。Apache OpenOffice Basic には、エラー処理用に機能が各種用意されています。
On Error 命令
On Error 命令は、エラー処理の中心となる機能です。
Sub Test
On Error Goto ErrorHandler
' ... undertake task during which an error may occur
Exit Sub
ErrorHandler:
' ... individual code for error handling
End Sub
ここで On Error Goto ErrorHandler 行により、Apache OpenOffice Basic が、エラー発生時にどのように動作するか指定しています。たとえばこの場合の Goto ErrorHandler は、現在の実行行を中断させて、ErrorHandler: で指定するコードブロックを Apache OpenOffice Basic に実行させます。
Resume コマンド
Resume Next コマンドを使うと、エラーハンドラ用コードを実行した後で、エラー発生行の次の行にプログラム実行を戻して、処理を再開させることができます。
ErrorHandler:
' ... individual code for error handling
Resume Next
また Resume Proceed コマンドを使用すると、エラーハンドラ用コードを実行した後のプログラムの実行開始位置を指定することができます。
ErrorHandler:
' ... individual code for error handling
Resume Proceed
Proceed:
' ... the program continues here after the error
エラーが発生した際に、エラーメッセージを表示させずにプログラムを継続させるには、次のように記述します。
Sub Test
On Error Resume Next
' ... perform task during which an error may occur
End Sub
この On Error Resume Next コマンドの作用範囲はプログラム全域に及ぶので、使用する際には注意が必要です。
エラーの関連情報の取得
エラー処理を行う場合、エラーの内容と発生箇所の情報が確認できると有用です。
- Err 変数には、発生したエラー番号が格納されます。
- Error$ 変数には、発生したエラーの内容が格納されます。
- Erl 変数には、エラーの発生した行番号が格納されます。
このメソッドは、次のような形式で使用します。
MsgBox "Error " & Err & ": " & Error$ & " (line : " & Erl & ")"
この場合は、メッセージウィンドウにエラーの内容が表示されます。
これらのエラー情報は、次に Resume または On Error コマンドを実行するまで維持され、これらを実行した段階でリセットされます。
VBA では、Err オブジェクトに対する Err.Clear メソッドにより、エラー情報をリセットします。Apache OpenOffice Basic では、On Error または Resume コマンドがこの機能を果たしています。 |
効率的なエラー処理のヒント
エラーハンドラを設定する On Error コマンドも、実行行を復帰させる Resume コマンドも、いわゆる Goto コマンドの一種です。
この種の実行行をジャンプさせるコマンドは、エラーの発生を予防する観点からも、コード内での多用を避けるべきです。
また On Error Resume Next コマンドは、エラーの関連情報をリセットしてしまうので、その使用に当たっては注意が必要です。
最善の方法は、プログラム内でエラー処理を行うブロックを一カ所にまとめておくことです。つまり、エラー処理ブロックをプログラム本体のコード部から分離しておき、エラー処理が終わっても実行行はエラー発生行にジャンプさせないようにします。
次のサンプルコードは、エラー処理の流れを示しています。
Sub Example
' Define error handler at the start of the function
On Error Goto ErrorHandler
' ... Here is the actual program code
On Error Goto 0 ' Deactivate error handling
' End of regular program implementation
Exit Sub
' Start point of error handling
ErrorHandler:
' Check whether error was expected
If Err = ExpectedErrorNo Then
' ... Process error
Else
' ... Warning of unexpected error
End If
On Error Goto 0 ' Deactivate error handling
End Sub
この手続きでは、一番最初にエラーハンドラを設定してから、プログラム本体のコードを記述しています。そしてプログラム本体のコードの末尾で On Error Goto 0 によりエラーハンドラ機能を解除し、Exit Sub コマンドにより手続きの実行を終了させるようにしています (End Sub との違いに注意)。
このサンプルコードでは、あらかじめ想定されたエラーが発生したのかを、エラー番号をチェックすることで判定して (この例では判定用に ExpectedErrorNo という定数を使用) 、その結果に応じてエラー処理の内容を分岐させています。想定外のエラーが発生していた場合は、警告を表示します。このように、想定外のエラーの発生を検出するには、エラー番号を使ってチェックが行えます。
コード末尾に On Error Goto 0 を記述してあるのは、エラー情報 (エラー管理用のシステム変数 Err に記録されたエラーコード) をリセットして、次回以降に発生するエラーを正確に記録させるためです。
Content on this page is licensed under the Public Documentation License (PDL). |