「OpenOffice.org Basic」の版間の差分

削除された内容 追加された内容
M編集の要約なし
→‎文法: 項目: 「エラー処理」を追加。
1,143 行
LOOP WHILE i > 5
END SUB
 
=== エラー処理 ===
エラー処理とは、発生したエラー(例外)に、どう対処するのかということです。
 
通常、OpenOffice.org Basic では、エラーが発生すると、その箇所でプログラムの実行を止めてしまいます。ですが、'On Error' という記述で、エラーに対応することを明確にすると、処理の中断以外の方法をとることができます。
実際の対応の仕方には、2つあり、'On Error GoTo ラベル' 文で、処理を別の行へ移すか、'On Error Resume Next' 文で、エラーを無視しして処理を続行するのかを指示できます。
 
また、一度定義した、エラー処理を無効にするには、'On Error GoTo 0' という記述を行い、以前に設定したエラー処理を無効にします。
 
それ以外にも、エラーが発生すると設定される特殊な変数も存在します。
 
 
==== エラー処理の定義 ====
OpenOffice.org Basic での、エラー処理とは、エラーの際、「どの行へ処理を移すのか」であり、'GoTo' 文の応用と言えます。
定義の仕方は、まず、'On Error' という一文を記述し、エラーに対応することを明確にします。次に、'GoTo' 文で処理を移すか、'Resume' 文でエラーを無視し処理を続行するのかを記述します。
 
 
===== On Error GoTo ラベル =====
'On Error GoTo ラベル' は、指定行へ処理を移す場合に用います。
 
構文は次のようになります。
 
On Error GoTo ラベル
 
また、ここで示すラベルは、同一プロシージャ内に記述しておかなければなりません。
 
 
一般的な記述の仕方は次のようになります。
 
SUB Main
On Error GoTo Label
EXIT SUB '重要です。
Label:
'エラーの場合に実行されます。
END SUB
 
行ラベルの前に、'EXIT SUB' など、プロシージャから抜ける記述がなければ、ラベル以降のコードも実行されるため、エラー処理に限った記述ではなくなっていまいます。
 
SUB Main
On Error GoTo Label
Label:
'エラーとならない場合も実行されます。
END SUB
 
次の例では、'TestSubRoutine'内にエラーがあります。この場合、サブルーチン Main の、TestSubRoutine 呼び出し箇所のエラーとして、Label_In_The_Main へ処理が移ります。
 
SUB Main
On Error GoTo Label_In_The_Main
TestSubRoutine ()
EXIT SUB
Label_In_The_Main:
'この箇所が実行されます。
END SUB
SUB TestSubRoutine
DIM i AS Integer
i = 60000 ' i は整数型なので60000を代入できません。
END SUB
 
上述のエラーを、TestSubRoutine 内のエラーとして扱うには、TestSubRoutine 内にエラーに対応する記述が必要です。
SUB Main
On Error GoTo Label_In_The_Main
TestSubRoutine ()
EXIT SUB
Label_In_The_Main:
'実行さません。
END SUB
SUB TestSubRoutine
On Error GoTo Label_In_The_TestSubRoutine
DIM i AS Integer
i = 60000 ' i は整数型なので60000を代入できません。
EXIT SUB
Label_In_The_TestSubRoutine:
'実行されます。
END SUB
 
 
===== On Error Resume Next =====
'On Error Resume Next' は、エラーを無視し、処理を続行する場合に用います。
 
構文は、次のようになります。
On Error Resume Next
 
 
実際の用い方は、次のようです。
SUB Main
On Error Resume Next ' エラーでの処理の続行を明確にします。
DIM i AS Integer
i = 60000 ' エラーですが、処理は続きます。
print “OK”
END SUB
 
また、'Resume Next' を記述すると、エラー変数は、設定されなくなります。
 
 
==== エラー処理の無効化 ====
定義されている 'On Error' 文を無効にするには、'On Error GoTo 0' という一文を使用します。この場合、エラーが起こると、通常通り、プログラムの実行は中断されます。
 
===== On Error GoTo 0 =====
'On Error GoTo 0' は、定義したエラー処理を無効にするのに用います。
 
構文は、次のようになります。
On Error GoTo 0
 
 
実際の用い方は、次のようです。
SUB Main
On Error Resume Next
DIM i AS Integer
On Error GoTo 0 ' On Error Resume Next文を無効にします。
i = 60000 'エラーとなり、止まります。
END SUB
 
 
==== Resume ====
予約語、'Resume' は、処理の再開場所を指定するのに用います。
また、'Resume' 文が評価されると、エラー変数は全てリセットされます。
 
===== Resume Next =====
'Resume Next' は、エラーとなった次の行から処理を再開するのに用います。
 
構文は、次のようになります。
 
Resume Next
 
 
実際の用い方は、次のようになります。
 
Sub Main
On Error GoTo Label
DIM i AS Integer
i = 60000 'i は整数型なので、60000 の値を代入できません。
print “OK”' Resume Next で再開されます。
EXIT SUB
Label:
Resume Next
END SUB
 
 
===== Resume ラベル =====
'Resume ラベル'は、ラベルで示す行から処理を再開するのに用います。
 
構文は、次のようになります。
 
Resume ラベル
 
 
次の例では、エラーで Label行に処理が移った後、Continue行から再開しています。
 
Sub Main
On Error GoTo Label
DIM i AS Integer
i = 60000 'ここでエラーです。
EXIT SUB
Continue:
print “OK”
EXIT SUB
Label:
Resume Continue
END SUB
 
'Resume ラベル' は、'GoTo ラベル' とした場合と同じ働きをしていますが、'Resume' の持つ語の意味を考えると、より分かり易い記述になると思います。
 
 
==== エラー変数 ====
エラー変数とは、発生したエラーの内容を示す変数のことです。
 
全部で3つあり、それぞれ、'Err'、'Error$'、'Erl' となります。'Err' は、エラー番号を示し、'Error$' は、エラーの内容を表します。また、'Erl' は、エラーの発生した行番号が格納されています。
 
{| cellpadding="3"
|- bgcolor="#EEEEEE"
|変数
|内容
|-
|Err
|エラー番号
|-
|Error$
|エラーの内容
|-
|Erl
|エラーが発生した行番号
|}
 
 
次の場合、それぞれの変数の値は、'Erl=4'、'Error$=”オーバーフロー”'、'Err=6' となります。
 
1 SUB Main
2 On Error GoTo Label
3 DIM i AS Integer
4 i = 60000 '4行目でオーバーフローです。
5 EXIT SUB
6
7 Label:
8 print Erl & “: ” & Err & “ “ & Error$
9 END SUB
 
 
== 参考URL ==