エラー処理

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo
Book.png


プログラミングを進める際に大きな問題となるのが、エラーに対する修正タスクです。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 & ")"

この場合は、メッセージウィンドウにエラーの内容が表示されます。

Documentation note.png エラーの内容は、Apache OpenOffice Basic では Err, Error$Erl 変数に格納されますが、VBA では Err という名前のオブジェクトにまとめられます。

これらのエラー情報は、次に Resume または On Error コマンドを実行するまで維持され、これらを実行した段階でリセットされます。

Documentation note.png 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).


Personal tools