On Error Goto
Synopsis
On Error GoTo [ label | 0 ]
引数
On Error GoTo 文で使用する引数は、以下のとおりです。
label | Goto 操作のターゲットを表す行ラベル。ラベルは、後にコロン接尾語が続く有効な識別子です。詳細は、"Caché Basic の使用法" の "Labels" を参照してください。 |
概要
label 引数で指定した行で開始するエラー処理ルーチンを使用可能にします。実行時エラーが発生した場合、制御は指定された行に分岐して、エラー・ハンドラを有効にします。指定した行は On Error 文と同じプロシージャ内になければならず、そうでなければ、コンパイル時エラーが発生します。
label 引数は、現在のプログラム中の既存のラベルを指定します。ラベルのコロン接尾語は省略できます。ラベル名では、大文字と小文字が区別されます。存在しないラベル名を指定すると、実行時エラーが発生します。
以前にエラー処理を有効にした場合、On Error Goto 0 を使用して無効にしてください。
On Error Goto がエラーによってトリガされた場合は、自動的に無効にされます。したがって、2 度目のエラーが発生すると、無限ループが開始されるのではなく、プログラムの処理が中止されます。
エラー処理ルーチンは Sub プロシージャや、Function プロシージャではありません。行ラベルでマークされたコード・セクションです。
エラー処理ルーチンは Err オブジェクトの Number プロパティ値によって、エラーの原因を確認します。ルーチンは、他のエラーが発生する前もしくはエラーの原因となり得るプロシージャが呼び出される前に、関連したプロパティ値を Err オブジェクトで検証または保存します。Err オブジェクトのプロパティ値は最も最近のエラーのみを反映します。Err.Number に関連したエラー・メッセージは、Err.Description に含まれます。
例
以下の例は On Error Goto 文の使用法を示しています。ここでは、6 を 0 で除算しようとするエラーが生じています。ErrMod エラー・ハンドラは、エラー番号 (18) と説明を表示します。
Mod1:
On Error Goto ErrMod
PrintLn "Mod1 pre-div"
Println "result: ",6/0
Println "Mod1 post-div"
Goto Done
ErrMod:
Println "Handling an error!"
PrintLn "Error ",Err.Number," ",Err.Description
Done:
Println "All done"
次の例では、ErrMod エラー・ハンドラは、divisor を 1 に変更することによって 0 による除算の問題を修正し、Mod1 の演算を再試行します。ErrMod エラー処理モジュールを起動することにより、On Error Goto がリセットされ、このプログラムで 2 度目のエラー (5 を 0 で除算) が発生したときに、ErrMod を再び呼び出すのではなくプログラムが中止されることに注意してください。
Setup:
On Error Goto ErrMod
divisor=0
Mod1:
PrintLn "Mod1 pre-div"
Println "result: ",6/divisor
Println "Mod1 post-div"
Println 5/0
Goto Done
ErrMod:
Println "Handling an error!"
PrintLn "Error ",Err.Number," ",Err.Description
If Err.Number=18 Then
divisor=1
Goto Mod1
Else
Println Err.Number
End If
Done:
Println "All done"
以下の例は、ユーザ定義関数での On Error GoTo 文の使用法を示しています。
PrintLn ErrorTest(1)
PrintLn ErrorTest(0)
Function ErrorTest(Arg)
On Error Goto ErrDisplay
return 1/Arg
ErrDisplay:
PrintLn "Error ", Err.Number, " ", Err.Description, " ", Err.Source
Err.Clear
Return 0
End Function