情報関数を使用する

次の例では、LotusScript® で、エラー番号、それに関連するエラーメッセージ、その行番号を管理する方法を示しています。

例 1

サブルーチン DemoErr が呼び出されると、Error()、Err()、Erl() の値は、それぞれ空の文字列 ("")、ゼロ、ゼロと仮定されます。エラーが発生すると、値が設定し直されます。関連付けられたエラー処理ルーチンが完了すると、値は初期値にリセットされます。

Sub DemoErr
   ' Show values on entry to sub DemoErr.
   Print "Error: " Error(), "   Err:" Err(), "   Erl:" Erl()
   ' Designate an error-handling routine; then 
   ' create an error.
   On Error GoTo ShowErr
   Error 11                      ' This is line 10.
   ' Come here after Resume.
   Print "Error: " Error(), "   Err:" Err(), "   Erl:" Erl()
   Exit Sub
ShowErr:
   ' Display the values on entry to the 
   ' error-handling routine.
   Print "Error: " Error(), "   Err:" Err(), "   Erl:" Erl()
   Resume Next
End Sub
Call DemoErr()
' Output:
' Error:          Err: 0        Erl: 0 
' Error: Division by zero       Err: 11       Erl: 10
' Error:          Err: 0        Erl: 0 

例 2

この例は、エラー処理の間の、制御の流れ、制御変数 Error、Err、Erl の値の変化を示します。これは、ここに示したとおりに実行され動作しますが、不自然なスクリプトといえます。この例は、エラー処理の機能を示すことを目的に記述されています。

' This example omits the Exit Sub statement of the preceding
' example. As a result, execution continues on to the
' error-handling routine.
Sub ShowErr
   On Error GoTo CheckErr
   Error 150                      ' This is line 5.
   Print "Error was handled... Error, Err, Erl are now:"
   Print Error(), Err(), Erl()    ' This is line 7.
   ' Exit Sub statement was dropped here.
CheckErr:
   Print Error(), Err(), Erl()
   Resume Next                    ' This is line 11.
End Sub
Call ShowErr()
Print "Back from call of ShowErr"

行番号 5 でエラー 150 が発生した後、CheckErr にあるエラー処理ルーチンが次の行を表示します。

Cannot find module %s       150           5

Resume ステートメントの後、行番号 6 と 7 の Print ステートメントが次の 2 行を表示します。

Error was handled... Error, Err, Erl are now:
             0             0

CheckErr の Print ステートメントまで正常に実行され、そこで次の行が表示されます。

             0             0

実行は、行番号 11 の Resume Next ステートメントまで正常に進みます。カレントエラーがないので、Resume Next ステートメントが指定する次のステートメント (「Next」ステートメント) はありません。そのため、Resume ステートメント自体が無効となり、エラーを生成します。それがカレントエラーとなり、CheckErr のエラー処理ルーチンが再び呼び出されます。これが次の行を表示します。

RESUME without error        20            11

エラー処理ルーチンは、Resume Next ステートメントで終了します。「次の」ステートメントは End Sub です。したがって、サブルーチンは正常に終了し、サブルーチンの呼び出しの後の Print ステートメントが次の行を表示します。

Back from call of ShowErr

例 3

前の例のエラー処理ルーチンの先頭に Err ステートメントが置かれています。その結果、Erl の値が無効になります。Err によって指定されたエラーは記述されなくなります。

Sub ShowErr
   On Error GoTo CheckErr
   Error 150                      ' This is line 3.
   Print "Error was handled... Error, Err, Erl are now:"
   Print Error(), Err(), Erl()    ' This is line 5.
CheckErr:
   ' Reset the error number, without creating an error.
   Err 151
   Print Error(), Err(), Erl()
   Resume Next                     ' This is line 10.
End Sub
Call ShowErr()
Print "Back from call of ShowErr"

行番号 3 でエラー 150 が発生した後、CheckErr から始まるエラー処理ルーチンが実行されます。これは、最初にエラー番号 (Err の値) を 151 に設定します。また、Error 関数もリセットします (Erl 関数はリセットしません)。そこで、Print ステートメントが次の行を表示します。

Cannot find external name   151           3

Resume ステートメントの後、行番号 4 と 5 の Print ステートメントが次の 2 行を表示します。

Error was handled... Error, Err, Erl are now:
             0             0

実行は、CheckErr から始まるステートメントまで正常に行われます。CheckErr にある Err ステートメントがエラー番号をリセットし、Print ステートメントが次の行を表示します(カレントエラーはないため、Erl の値はゼロのままであることに注意してください)。

Cannot find external name   151           0

次に実行される Resume Next ステートメントは、カレントエラーがないため無効です。そこで、これがエラーを生成し、CheckErr から始まるエラー処理ルーチンが再び呼び出されます。これは、最初に Err を 151 に設定して、次の行を表示します(Error と Err の値は Err に最後に代入された値を表しますが、行番号 10 でカレントエラーが発生したため、Erl は 10 のままです)。

Cannot find external name   151           10

エラー処理ルーチンは、Resume Next ステートメントで終了します。「次の」ステートメントは End Sub です。したがって、サブルーチンは正常に終了し、サブルーチンの呼び出しの後の Print ステートメントは次の行を表示します。

Back from call of ShowErr