Difference between revisions of "JA/Documentation/BASIC Guide/Error Handling"

From Apache OpenOffice Wiki
Jump to: navigation, search
(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>ここで On Error Goto ErrorHandler</tt> 行により、{{OOo}} Basic が、エラー発生時にどのように動作するか指定しています。たとえばこの場合の <tt>Goto ErrorHandler</tt> は、現在の実行行を中断させて、{{OOo}} で指定するコードブロックを <tt>ErrorHandler:</tt> Basic に実行させます。
+
ここで <tt>On Error Goto ErrorHandler</tt> 行により、{{OOo}} Basic が、エラー発生時にどのように動作するか指定しています。たとえばこの場合の <tt>Goto ErrorHandler</tt> は、現在の実行行を中断させて、<tt>ErrorHandler:</tt> で指定するコードブロックを {{OOo}} Basic に実行させます。
  
==<tt>Resume コマンド</tt>==
+
==<tt>Resume</tt> コマンド==
  
 
<tt>Resume Next</tt> コマンドを使うと、エラーハンドラ用コードを実行した後で、エラー発生行の次の行にプログラム実行を戻して、処理を再開させることができます。
 
<tt>Resume Next</tt> コマンドを使うと、エラーハンドラ用コードを実行した後で、エラー発生行の次の行にプログラム実行を戻して、処理を再開させることができます。
Line 47: Line 47:
 
</source>
 
</source>
  
エラーが発生した際に、エラーメッセージを\'95\'5c示させずにプログラムを継続させるには、以下のように記述します。
+
エラーが発生した際に、エラーメッセージを表示させずにプログラムを継続させるには、次のように記述します。
  
 
<source lang="oobas">
 
<source lang="oobas">
Line 66: Line 66:
 
*<tt>Erl</tt> 変数には、エラーの発生した行番号が格納されます。
 
*<tt>Erl</tt> 変数には、エラーの発生した行番号が格納されます。
  
このメ\'83\'5cッドは、以下のような形式で使用します。
+
このメソッドは、次のような形式で使用します。
  
 
<source lang="oobas">
 
<source lang="oobas">
Line 72: Line 72:
 
</source>
 
</source>
  
この場合は、メッセージウィンドウにエラーの内容が\'95\'5c示されます。
+
この場合は、メッセージウィンドウにエラーの内容が表示されます。
  
 
{{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.Clear</tt> オブジェクトに対する <tt>Err</tt> メソッドにより、エラー情報をリセットします。{{OOo}} Basic では、<tt>On Error</tt> および <tt>Resume</tt> コマンドがこの機能を果たしています。}}
+
{{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> コマンドの一種です。
  
この種の実行行をジャンプさせるコ\'83\'7dンドは、エラーの発生を\'97\'5c防する観点からも、コード内での多用を避けるべきです。
+
この種の実行行をジャンプさせるコマンドは、エラーの発生を予防する観点からも、コード内での多用を避けるべきです。
  
 
また <tt>On Error Resume Next</tt> コマンドは、エラーの関連情報をリセットしてしまうので、その使用に当たっては注意が必要です。
 
また <tt>On Error Resume Next</tt> コマンドは、エラーの関連情報をリセットしてしまうので、その使用に当たっては注意が必要です。
  
最善の方法は、プログラム内でエラー処理を行うブロックを一カ所にまとめておくことです。つまり、エラー処理ブロックをプログラム\'96\'7b体のコード部から分離しておき、エラー処理が終わっても実行行はエラー発生行にジャンプさせないようにします。
+
最善の方法は、プログラム内でエラー処理を行うブロックを一カ所にまとめておくことです。つまり、エラー処理ブロックをプログラム本体のコード部から分離しておき、エラー処理が終わっても実行行はエラー発生行にジャンプさせないようにします。
  
以下のサンプルコードは、エラー処理の流れを示しています。
+
次のサンプルコードは、エラー処理の流れを示しています。
  
 
<source lang="oobas">
 
<source lang="oobas">
Line 113: Line 113:
 
</source>
 
</source>
  
この手続きでは、一番最初にエラーハンドラを設定してから、プログラム\'96\'7b体のコードを記述しています。そしてプログラム本体のコードの末尾で <tt>On Error Goto 0</tt> によりエラーハンドラ機能を解除し、<tt>Exit Sub</tt> コマンドにより手続きの実行を終了させるようにしています ( <tt>End Sub</tt> との違いに注意) 。
+
この手続きでは、一番最初にエラーハンドラを設定してから、プログラム本体のコードを記述しています。そしてプログラム本体のコードの末尾で <tt>On Error Goto 0</tt> によりエラーハンドラ機能を解除し、<tt>Exit Sub</tt> コマンドにより手続きの実行を終了させるようにしています (<tt>End Sub</tt> との違いに注意)。
  
このサンプルコードでは、あらかじめ想定されたエラーが発生したのかを、エラー番号をチェックすることで判定して (この例では判定用に <tt>ExpectedErrorNo</tt> という定数を使用) 、その結果に応じてエラー処理の内容を分岐させています。想定外のエラーが発生していた場合は、警告を\'95\'5c示します。このように、想定外のエラーの発生を検出するには、エラー番号を使ってチェックが行えます。
+
このサンプルコードでは、あらかじめ想定されたエラーが発生したのかを、エラー番号をチェックすることで判定して (この例では判定用に <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

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 & ")"

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

Template:Documentation/Note

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

Template:Documentation/Note

効率的なエラー処理のヒント

エラーハンドラを設定する 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