目次
- 1 トラップできるエラーの種類
- 2 TRYでの処理の流れ
- 3 エラーの種類
- 3.1 関数: (関数名) がありません
- 3.2 型が合っていない or オーバーフロー
- 3.3 IF行のマルチ宣言はNG
- 3.4 OLE関数が正しく閉じていません
- 3.5 定数には値を代入できません
- 3.6 変数: X が定義されていません
- 3.7 式がおかしい or 型が合っていない
- 3.8 関数名: Resultが無い
- 3.9 WHILE に対しWEND が無い
- 3.10 "IN" もしくは "=" 指定が無い
- 3.11 TOが無い
- 3.12 FORに対しNEXTが無い
- 3.13 REPEAT の後に記述はできません
- 3.14 UNTIL に対し REPEAT が無いか式定義がない
- 3.15 対応する FOR が無い
- 3.16 対応する WHILE が無い
- 3.17 対応する REPEAT が無い
- 3.18 NEXT の後に記述はできません
- 3.19 ループ外に CONTINUE 文がある
- 3.20 ループ外に BREAK 文がある
- 3.21 COM_Error
- 3.22 SyntaxError(構文エラー)
- 3.23 KansuCall:Overflow while converting variant of type (A) into type (B)
- 3.24 KansuCall:Could not convert variant of type (A) into type (B)
- 3.25 KansuCall:Access violation at address 0040B12A in module 'UDebug.exe'. Read of address xxxxxxxx
- 4 使い方
プログラムの実行の継続を妨げる異常な事象(エラー)が発生した際に、実行される処理を記述します。
- 構文
- // TRY - FINALLY ルーチン中断時にも必ず実行されます
TRY処理(EXIT)FINALLY処理ENDTRYもしくは// TRY - EXCEPT 実行時エラーが起きた時に実行されます
TRY処理(エラー)EXCEPT処理ENDTRYエラーメッセージは特殊変数 TRY_ERRMSG に格納
エラー行は特殊変数 TRY_ERRLINE に格納
- 引数
- 戻り値
- TRY_ERRMSG
- エラーメッセージ
- TRY_ERRLINE
- エラー行
TRY節でEXITを記述した場合、FINALLY節は実行されるがEXITEXITを記述した場合は、FINALLY節も実行されずに終了します。
トラップできるエラーの種類
- 型が合っていない or オーバーフロー
- 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-COM_ERR_RETを参考にしてください。
関数: (関数名) がありません
存在しない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で関数定義をするときはResultで戻り値が必須です。戻り値を返す必要がない場合はPROCEDURE-FENDを使います。
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.Workbooks.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
KansuCall:Overflow while converting variant of type (A) into type (B)
型Aから型Bへの変換時にオーバーフローが発生しました。
PRINT VARTYPE(1000, VAR_SBYTE)
KansuCall:Overflow while converting variant of type (Double) into type (ShortInt)
KansuCall:Could not convert variant of type (A) into type (B)
型Aから型Bへの変換に失敗したときに発生します。
PRINT VARTYPE(NULL, VAR_EMPTY)
Null型からEmpty型への型変換に失敗しました。
Could not convert variant of type (Null) into type (Empty)
VAR_EMPTY | Empty |
VAR_NULL | Null |
VAR_SMALLINT | Smallint |
VAR_INTEGER | Integer |
VAR_SINGLE | Single |
VAR_DOUBLE | Double |
VAR_CURRENCY | Currency |
VAR_DATE | Date |
VAR_DISPATCH | Integer |
VAR_ERROR | Error |
VAR_VARIANT | Variant |
VAR_UNKNOWN | Unknown |
VAR_SBYTE | ShortInt |
VAR_BYTE | Byte |
VAR_WORD | Word |
VAR_DWORD | LongWord |
VAR_INT64 | Int64 |
VAR_ASTR | String |
VAR_USTR | OleStr |
VAR_ARRAY |
CONST xlLastCell = 11
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Workbooks.Open("D:\Documents\型変換一覧.xlsx")
DIM r = Excel.Range("A1").SpecialCells(xlLastCell).Address // UString
PRINT r.Row
COM_Error:Could not convert variant of type (UnicodeString) into type (Dispatch)
KansuCall:Access violation at address 0040B12A in module 'UDebug.exe'. Read of address xxxxxxxx
'UDebug.exe'がアクセスできない領域にアクセスしようとしたためエラー(アクセス違反)が発生しました。
PRINT VARTYPE(100, VAR_DISPATCH)
「xxxxxxxx」の部分には16進数の値が入ります。今回の場合、10進数の100を16進数に変換した「64」。
KansuCall:Access violation at address 0040B12A in module 'UDebug.exe'. Read of address 00000064
使い方
Excelでシートの存在確認
以下はエラー発生することを利用した例。Excelでシートを取得できなかった場合エラーが発生するので、シートの存在の有無を確認することができます。
TRY
DIM SheetName ="東京都"
DIM Worksheet = Excel.Sheets(SheetName)
PRINT SheetName + "は存在します"
EXCEPT
PRINT SheetName + "は存在しません"
ENDTRY
異常発生時にもファイルを閉じる
TRY
DIM FID = FOPEN(path)
エラーが発生する可能性のある処理
EXCEPT
FCLOSE(FID)
ENDTRY