プログラムの実行の継続を妨げる異常な事象(エラー)が発生した際に、実行される処理を記述します。
- 構文
- // TRY - FINALLY ルーチン中断時にも必ず実行されます
TRY処理(EXIT)FINALLY処理ENDTRYもしくは// TRY - EXCEPT 実行時エラーが起きた時に実行されます
TRY処理(エラー)EXCEPT処理ENDTRYエラーメッセージは特殊変数TRY_ERRMSGに格納
エラー行は特殊変数TRY_ERRLINEに格納
- 引数
- 戻り値
- TRY_ERRMSG
- エラーメッセージ
- TRY_ERRLINE
- エラー行
TRY節でEXITを記述した場合、FINALLY節は実行されるがEXITEXITを記述した場合は、FINALLY節も実行されずに終了します。
構文エラーと例外
プログラム実行時に発生するエラーには、構文エラー(syntax error)と例外(exception)の2種類があります。
構文エラーはプログラムの記述ミスがあるときに発生するエラーで、プログラムの実行前に発生します。SyntaxErrorというメッセージと一緒にエラーが発生した行も指摘されるため、プログラムの修正は比較的簡単に行うことができます。
以下に構文エラーが発生する具体的な例を示します。
- スペルミス
- 宣言していない変数の使用
- 関数の引数の数が合わない
- 変数・定数の二重定義
- 関数やメソッドの括弧を閉じ忘れている
一方、例外は構文が正しくても発生することのあるエラーです。構文に間違いはないため構文チェックでは検知されず、プログラムの実行中に初めてエラーが出ます。
UWSCのPro版を使っている場合はUWSC Debuggerでデバッグを行い一行ずつ処理を確認することでエラーの原因を見つけることもできますが、エラーが必ず発生するとも限らないため原因を特定することが難しいこともあります。
UWSCではこのようなエラーを適切に処理するために例外の仕組みを備えていて、エラーが発生したとき通常の処理を中断し別の処理を行うことができこれをトラップといいます。
特殊変数
TRY節でエラーが発生したとき特殊変数のTRY_ERRMSGにエラーメッセージ、TRY_ERRLINEにエラー行が代入されます。エラーが発生したときに表示されるメッセージボックスの内容の1行目がエラーメッセージ、2行目がエラー行です。エラー行は行番号だけでなく、その行のプログラムも表示されます。
以下はインプットボックスに入力された数式の計算結果を表示するプログラムです。インプットボックスに入力した3**5という数式が正しくないためEVAL関数の箇所でエラーが発生してEXCEPT節に処理が飛び、エラーメッセージとエラー行が出力されています。
- 結果
正しい数式を入力してエラーが発生しなければEXCEPT節は実行されません。
- 結果
TRY_ERRLINEはエラーの発生した行番号とプログラムが代入されるので、行番号のみを数値で取得したい場合は以下のプログラムを実行します。lineに行番号のみが数値で代入されます。
トラップ可能なエラー
型が合っていない or オーバーフロー
変数の型が合っていなくて処理ができないときに表示されるメッセージです。数値と文字列で計算をしようとすると表示されます。
KansuCall:Overflow while converting variant of type (xxx) into type (yyy)
COM_Error:例外が発生しました。
CREATEOLEOBJ関数 (スクリプト関数)で生成したCOMオブジェクトの処理にエラーが発生したときに表示されるメッセージです。
TRYでの処理の流れ
TRY節でエラーが発生しなかった場合、EXCEPT節は実行されない。
- 結果
FINALLY節はTRY節でエラーが発生しなくても実行される。
- 結果
TRY節でEXITが実行された場合も、FINALLY節は実行される。
- 結果
TRY節でEXITEXITが実行された場合は、FINALLY節は実行されない。
- 結果
TRYの入れ子も可能。
- 結果
TRY節でエラーが発生した場合それ以降の処理は実行されず、EXCEPT節に飛ぶ。
- 結果
TRYが入れ子でエラーが発生した場合、対応するEXCEPT節に飛ぶ。
- 結果
EXCEPT節でエラーが発生した場合、ENDTRYの下に飛ぶ。
- 結果
エラーの種類
COMオブジェクトによるエラーはCOM_ERR_IGN-COM_ERR_RETを参考にしてください。
関数: (関数名) がありません
存在しないUWSC関数を使用したときに発生します。
以下は「FUKIDASI」とかくべきところを「FUKIDASHI」と書いたためにエラーが発生しています。
型が合っていない or オーバーフロー
IF行のマルチ宣言はNG
IF文のTHEN節にマルチステートメントで複数の命令を書いたときに発生します。
OLE関数が正しく閉じていません
定数には値を代入できません
CONSTで宣言した定数の値は変更することができません。値が変わることのおる場合は、DIMまたはPUBLICで変数として宣言します。
円周率\(\pi\)や自然対数\(e\)など変更されることのない値は定数として定義します。
変数: X が定義されていません
式がおかしい or 型が合っていない
関数名: Resultが無い
FUNCTIONで関数定義をするときはResultで戻り値が必須です。戻り値を返す必要がない場合はPROCEDURE-FENDを使います。
WHILE に対しWEND が無い
"IN" もしくは "=" 指定が無い
TOが無い
FORに対しNEXTが無い
REPEAT の後に記述はできません
UNTIL に対し REPEAT が無いか式定義がない
対応する FOR が無い
対応する WHILE が無い
対応する REPEAT が無い
NEXT の後に記述はできません
ループ外に CONTINUE 文がある
ループ外に BREAK 文がある
COM_Error
SyntaxError(構文エラー)
関数:(関数名)
定義された構文を間違った書き方をしたときに発生します。
以下はデフォルトパラメータ以降に通常引数を書いたために発生したエラー。
KansuCall:Overflow while converting variant of type (A) into type (B)
型Aから型Bへの変換時にオーバーフローが発生しました。
KansuCall:Could not convert variant of type (A) into type (B)
型Aから型Bへの変換に失敗したときに発生します。
Null型から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 |
KansuCall:Access violation at address 0040B12A in module 'UDebug.exe'. Read of address xxxxxxxx
'UDebug.exe'がアクセスできない領域にアクセスしようとしたためエラー(アクセス違反)が発生しました。
「xxxxxxxx」の部分には16進数の値が入ります。今回の場合、10進数の100を16進数に変換した「64」。
使い方
Excelでシートの存在確認
以下はエラー発生することを利用した例。Excelでシートを取得できなかった場合エラーが発生するので、シートの存在の有無を確認することができます。
