Difference between revisions of "JA/Documentation/BASIC Guide/Error Handling"
(New page: {{JA/Documentation/BASICGuideTOC/v2 |ShowPrevNext=block |ShowPrevPage=block |PrevPage=Documentation/BASIC Guide/Procedures and Functions |NextPage=Documentation/BASIC Guide/Runtime Library...) |
|||
Line 24: | Line 24: | ||
</source> | </source> | ||
− | <tt> | + | ここで <tt>On Error Goto ErrorHandler</tt> 行により、{{OOo}} Basic が、エラー発生時にどのように動作するか指定しています。たとえばこの場合の <tt>Goto ErrorHandler</tt> は、現在の実行行を中断させて、<tt>ErrorHandler:</tt> で指定するコードブロックを {{OOo}} Basic に実行させます。 |
− | ==<tt>Resume | + | ==<tt>Resume</tt> コマンド== |
<tt>Resume Next</tt> コマンドを使うと、エラーハンドラ用コードを実行した後で、エラー発生行の次の行にプログラム実行を戻して、処理を再開させることができます。 | <tt>Resume Next</tt> コマンドを使うと、エラーハンドラ用コードを実行した後で、エラー発生行の次の行にプログラム実行を戻して、処理を再開させることができます。 | ||
Line 47: | Line 47: | ||
</source> | </source> | ||
− | + | エラーが発生した際に、エラーメッセージを表示させずにプログラムを継続させるには、次のように記述します。 | |
<source lang="oobas"> | <source lang="oobas"> | ||
Line 66: | Line 66: | ||
*<tt>Erl</tt> 変数には、エラーの発生した行番号が格納されます。 | *<tt>Erl</tt> 変数には、エラーの発生した行番号が格納されます。 | ||
− | + | このメソッドは、次のような形式で使用します。 | |
<source lang="oobas"> | <source lang="oobas"> | ||
Line 72: | Line 72: | ||
</source> | </source> | ||
− | + | この場合は、メッセージウィンドウにエラーの内容が表示されます。 | |
{{Documentation/Note|エラーの内容は、{{OOo}} Basic では <tt>Err,</tt> <tt>Error$</tt>、<tt>Erl</tt> 変数に格納されますが、VBA では <tt>Err</tt> という名前のオブジェクトにまとめられます。}} | {{Documentation/Note|エラーの内容は、{{OOo}} Basic では <tt>Err,</tt> <tt>Error$</tt>、<tt>Erl</tt> 変数に格納されますが、VBA では <tt>Err</tt> という名前のオブジェクトにまとめられます。}} | ||
Line 78: | Line 78: | ||
これらのエラー情報は、次に <tt>Resume</tt> または <tt>On Error</tt> コマンドを実行するまで維持され、これらを実行した段階でリセットされます。 | これらのエラー情報は、次に <tt>Resume</tt> または <tt>On Error</tt> コマンドを実行するまで維持され、これらを実行した段階でリセットされます。 | ||
− | {{Documentation/Note|VBA では、<tt>Err | + | {{Documentation/Note|VBA では、<tt>Err</tt> オブジェクトに対する <tt>Err.Clear</tt> メソッドにより、エラー情報をリセットします。{{OOo}} Basic では、<tt>On Error</tt> または <tt>Resume</tt> コマンドがこの機能を果たしています。}} |
== 効率的なエラー処理のヒント == | == 効率的なエラー処理のヒント == | ||
Line 84: | Line 84: | ||
エラーハンドラを設定する <tt>On Error</tt> コマンドも、実行行を復帰させる <tt>Resume</tt> コマンドも、いわゆる <tt>Goto</tt> コマンドの一種です。 | エラーハンドラを設定する <tt>On Error</tt> コマンドも、実行行を復帰させる <tt>Resume</tt> コマンドも、いわゆる <tt>Goto</tt> コマンドの一種です。 | ||
− | + | この種の実行行をジャンプさせるコマンドは、エラーの発生を予防する観点からも、コード内での多用を避けるべきです。 | |
また <tt>On Error Resume Next</tt> コマンドは、エラーの関連情報をリセットしてしまうので、その使用に当たっては注意が必要です。 | また <tt>On Error Resume Next</tt> コマンドは、エラーの関連情報をリセットしてしまうので、その使用に当たっては注意が必要です。 | ||
− | + | 最善の方法は、プログラム内でエラー処理を行うブロックを一カ所にまとめておくことです。つまり、エラー処理ブロックをプログラム本体のコード部から分離しておき、エラー処理が終わっても実行行はエラー発生行にジャンプさせないようにします。 | |
− | + | 次のサンプルコードは、エラー処理の流れを示しています。 | |
<source lang="oobas"> | <source lang="oobas"> | ||
Line 113: | Line 113: | ||
</source> | </source> | ||
− | + | この手続きでは、一番最初にエラーハンドラを設定してから、プログラム本体のコードを記述しています。そしてプログラム本体のコードの末尾で <tt>On Error Goto 0</tt> によりエラーハンドラ機能を解除し、<tt>Exit Sub</tt> コマンドにより手続きの実行を終了させるようにしています (<tt>End Sub</tt> との違いに注意)。 | |
− | このサンプルコードでは、あらかじめ想定されたエラーが発生したのかを、エラー番号をチェックすることで判定して (この例では判定用に <tt>ExpectedErrorNo</tt> という定数を使用) | + | このサンプルコードでは、あらかじめ想定されたエラーが発生したのかを、エラー番号をチェックすることで判定して (この例では判定用に <tt>ExpectedErrorNo</tt> という定数を使用) 、その結果に応じてエラー処理の内容を分岐させています。想定外のエラーが発生していた場合は、警告を表示します。このように、想定外のエラーの発生を検出するには、エラー番号を使ってチェックが行えます。 |
コード末尾に <tt>On Error Goto 0</tt> を記述してあるのは、エラー情報 (エラー管理用のシステム変数 <tt>Err</tt> に記録されたエラーコード) をリセットして、次回以降に発生するエラーを正確に記録させるためです。 | コード末尾に <tt>On Error Goto 0</tt> を記述してあるのは、エラー情報 (エラー管理用のシステム変数 <tt>Err</tt> に記録されたエラーコード) をリセットして、次回以降に発生するエラーを正確に記録させるためです。 |
Revision as of 22:08, 27 November 2008
プログラミングを進める際に大きな問題となるのが、エラーに対する修正作業です。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 コマンドを実行するまで維持され、これらを実行した段階でリセットされます。
効率的なエラー処理のヒント
エラーハンドラを設定する 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). |