例外処理

エラー処理を行います。

構文
// TRY - FINALLY ルーチン中断時にも必ず実行されます
TRY
処理(EXIT)
FINALLY
処理
ENDTRY
もしくは
// TRY - EXCEPT 実行時エラーが起きた時に実行されます
TRY
処理(エラー)
EXCEPT
処理
ENDTRY
エラーメッセージは特殊変数 TRY_ERRMSG に格納
エラー行は特殊変数 TRY_ERRLINE に格納
引数
戻値
TRY_ERRMSG
エラーメッセージ
TRY_ERRLINE
エラー行

TRY節でEXITを記述した場合、FINALLY節は実行されるがEXITEXITを記述した場合は、FINALLY節も実行されずに終了します。

トラップできるエラーの種類

  1. 型が合っていない or オーバーフロー
  2. COM_Error:例外が発生しました。

TRYでの処理の流れ

TRY節でエラーが発生しなかった場合、EXCEPT節は実行されない。

TRY
	PRINT 1
EXCEPT
	PRINT 2
ENDTRY

PRINT 3
結果
1
3

FINALLY節はTRY節でエラーが発生しなくても実行される。

TRY
	PRINT 1
FINALLY
	PRINT 2
ENDTRY

PRINT 3
結果
1
2
3

TRY節でEXITが実行された場合も、FINALLY節は実行される。

TRY
	PRINT 1
	EXIT
FINALLY
	PRINT 2
ENDTRY

PRINT 3
結果
1
2

TRY節でEXITEXITが実行された場合は、FINALLY節は実行されない。

TRY
	PRINT 1
	EXITEXIT
FINALLY
	PRINT 2
ENDTRY

PRINT 3
結果
1

TRYの入れ子も可能。

TRY
	PRINT 1
	TRY
		PRINT 2
	EXCEPT
		PRINT 3
	ENDTRY
	PRINT 4
EXCEPT
	PRINT 5
ENDTRY

PRINT 6
結果
1
2
4
6

TRY節でエラーが発生した場合それ以降の処理は実行されず、EXCEPT節に飛ぶ。

TRY
	PRINT 1
	DIM a = “a”; PRINT 1 / a   // エラー
	TRY
		PRINT 2
	EXCEPT
		PRINT 3
	ENDTRY
	PRINT 4
EXCEPT
	PRINT 5
ENDTRY

PRINT 6
結果
1
5
6

TRYが入れ子でエラーが発生した場合、より内側のEXCEPT節に飛ぶ。

TRY
	PRINT 1
	TRY
		PRINT 2
		DIM a = “a”; PRINT 1 / a   // エラー
	EXCEPT
		PRINT 3
	ENDTRY
	PRINT 4
EXCEPT
	PRINT 5
ENDTRY

PRINT 6
結果
1
2
3
4
6

EXCEPT節でエラーが発生した場合、ENDTRYの下に飛ぶ。

TRY
	PRINT 1
	TRY
		PRINT 2
	EXCEPT
		DIM a = “a”; PRINT 1 / a   // エラー
		PRINT 3
	ENDTRY
	PRINT 4
EXCEPT
	PRINT 5
ENDTRY

PRINT 6
結果
1
2
4
6

エラーの種類

COMオブジェクトによるエラーはCOM_ERR_IGNを参考にしてください。

関数: (関数名) がありません

存在しないUWSC関数を使用したときに発生します。

以下は「FUKIDASI」とかくべきところを「FUKIDASHI」と書いたためにエラーが発生しています。

FUKIDASHI(“message”)
関数: FUKIDASHI がありません
1行目: FUKIDASHI(“message”)

型が合っていない or オーバーフロー

DIM a = “a”
PRINT 1 / a
型が合っていない or オーバーフロー
2行目: PRINT 1 / a

IF行のマルチ宣言はNG

IF文のTHEN節にマルチステートメントで複数の命令を書いたときに発生します。

OLE関数が正しく閉じていません

IE.Navigate(“http://example.com”
)
OLE関数が正しく閉じていません
3行目: IE.Navigate(“http://example.com”

定数には値を代入できません

CONSTで宣言した定数の値は変更することができません。値が変わることのおる場合は、DIMまたはPUBLICで変数として宣言します。

CONST a = 1
a = 2
定数には値を代入できません
2行目: a = 2

円周率\(\pi\)や自然対数\(e\)など変更されることのない値は定数として定義します。

CONST pi = 3.14159265358
CONST e = 2.718281828459

変数: X が定義されていません

DIM a = 1
PRINT a + b
変数: B が定義されていません
2行目: PRINT a + b

式がおかしい or 型が合っていない

PRINT add(1. 2, 3)
式がおかしい or 型が合っていない
1行目: PRINT add(1. 2, 3)

関数名: Resultが無い

FUNCTION add(a, b)
FEND
ADD: Resultが無い
2行目: FEND

WHILE に対しWEND が無い

WHILE TRUE
	SLEEP(0.001)
WHILE に対しWEND が無い
1行目: WHILE TRUE

“IN” もしくは “=” 指定が無い

FOR TRUE
	SLEEP(0.001)
NEXT
“IN” もしくは “=” 指定が無い
1行目: FOR TRUE

TOが無い

FOR i = 1 IN 5
	SLEEP(0.001)
NEXT
TOが無い
1行目: FOR I = 1 IN 5

FORに対しNEXTが無い

FOR r = 0 TO 9
	FOR c = 0 TO 9
NEXT
FORに対しNEXTが無い
1行目: FOR R = 0 TO 9

REPEAT の後に記述はできません

REPEAT TRUE
	SLEEP(0.001)
UNTIL
REPEAT の後に記述はできません
1行目: REPEAT TRUE

UNTIL に対し REPEAT が無いか式定義がない

REPEAT
	SLEEP(0.001)
NEXT
UNTIL に対し REPEAT が無いか式定義がない
1行目: REPEAT

対応する FOR が無い

	SLEEP(0.001)
NEXT
対応する FOR が無い
2行目: NEXT

対応する WHILE が無い

	SLEEP(0.001)
WEND
対応する WHILE が無い
2行目: WEND

対応する REPEAT が無い

	SLEEP(0.001)
UNTIL
対応する REPEAT が無い
2行目: UNTIL

NEXT の後に記述はできません

FOR i = 0 TO 5
	SLEEP(0.001)
NEXT i
NEXT の後に記述はできません
1行目: FOR i = 0 TO 5

ループ外に CONTINUE 文がある

IF TRUE THEN CONTINUE
ループ外に CONTINUE 文がある
1行目: IF TRUE THEN CONTINUE

ループ外に BREAK 文がある

IF TRUE THEN BREAK
ループ外に BREAK 文がある
1行目: IF TRUE THEN BREAK

COM_Error

TRY
	DIM Excel = CREATEOLEOBJ(“Excel.Application”)
	Excel.Visible = TRUE
	Excel.Workaooks.Add()
	DIM Worksheet = Excel.Sheets(“Sheet10”)
EXCEPT
ENDTRY
COM_Error:例外が発生しました。
5行目: DIM Worksheet = Excel.Sheets(“Sheet10”)
実行時エラー ‘9’
インデックスが有効範囲にありません。

SyntaxError(構文エラー)

関数:(関数名)

定義された構文を間違った書き方をしたときに発生します。

以下はデフォルトパラメータ以降に通常引数を書いたために発生したエラー。

PRINT add(1,2, 3, 4)

FUNCTION add(a, b, c = 1, d)
	RESULT = a + b + c + d
FEND
SyntaxError
関数:ADD

以下はエラー発生することを利用した例。Excelでシートを取得できなかった場合エラーが発生するので、シートの存在の有無を確認することができます。

TRY
	DIM SheetName =”東京都”
	DIM Worksheet = Excel.Sheets(SheetName)
	PRINT SheetName + “は存在します”
EXCEPT
	PRINT SheetName + “は存在しません”
ENDTRY