例外処理

本ページには広告が含まれています。

プログラムの実行の継続を妨げる異常な事象(エラー)が発生した際に、実行される処理を記述します。

構文
// 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節に処理が飛び、エラーメッセージとエラー行が出力されています。

UWSC
結果
プレーンテキスト

正しい数式を入力してエラーが発生しなければEXCEPT節は実行されません。

結果
プレーンテキスト

TRY_ERRLINEはエラーの発生した行番号とプログラムが代入されるので、行番号のみを数値で取得したい場合は以下のプログラムを実行します。lineに行番号のみが数値で代入されます。

UWSC

トラップ可能なエラー

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

変数の型が合っていなくて処理ができないときに表示されるメッセージです。数値と文字列で計算をしようとすると表示されます。

KansuCall:Overflow while converting variant of type (xxx) into type (yyy)

日本語訳は「xxx型の変数をyyy型に変換する際にオーバーフローが発生しました」という意味です。大きい数値を扱える型から小さい数値を扱う型に型変換をしたときに表示されるメッセージで、xxx、yyyには変数の型が入ります。型が扱える範囲は変数を参考にしてください。

UWSC

COM_Error:例外が発生しました。

CREATEOLEOBJ関数 (スクリプト関数)で生成したCOMオブジェクトの処理にエラーが発生したときに表示されるメッセージです。

TRYでの処理の流れ

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

UWSC
結果
プレーンテキスト

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

UWSC
結果
プレーンテキスト

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

UWSC
結果
プレーンテキスト

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

UWSC
結果
プレーンテキスト

TRYの入れ子も可能。

UWSC
結果
プレーンテキスト

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

UWSC
結果
プレーンテキスト

TRYが入れ子でエラーが発生した場合、対応するEXCEPT節に飛ぶ。

UWSC
結果
プレーンテキスト

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

UWSC
結果
プレーンテキスト

エラーの種類

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

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

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

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

UWSC
UWSC

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

UWSC
UWSC

IF行のマルチ宣言はNG

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

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

UWSC
UWSC

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

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

UWSC
UWSC

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

UWSC

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

UWSC
UWSC

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

UWSC
UWSC

関数名: Resultが無い

FUNCTIONで関数定義をするときはResultで戻り値が必須です。戻り値を返す必要がない場合はPROCEDURE-FENDを使います。

UWSC
UWSC

WHILE に対しWEND が無い

UWSC
UWSC

"IN" もしくは "=" 指定が無い

UWSC
UWSC

TOが無い

UWSC
UWSC

FORに対しNEXTが無い

UWSC
UWSC

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

UWSC
UWSC

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

UWSC
UWSC

対応する FOR が無い

UWSC
UWSC

対応する WHILE が無い

UWSC
UWSC

対応する REPEAT が無い

UWSC
UWSC

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

UWSC
UWSC

ループ外に CONTINUE 文がある

UWSC
UWSC

ループ外に BREAK 文がある

UWSC
UWSC

COM_Error

UWSC
UWSC
Microsoft Visual Basic

SyntaxError(構文エラー)

関数:(関数名)

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

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

UWSC
UWSC

KansuCall:Overflow while converting variant of type (A) into type (B)

型Aから型Bへの変換時にオーバーフローが発生しました。

UWSC
UWSC

KansuCall:Could not convert variant of type (A) into type (B)

型Aから型Bへの変換に失敗したときに発生します。

UWSC

Null型からEmpty型への型変換に失敗しました。

UWSC
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
UWSC
UWSC

KansuCall:Access violation at address 0040B12A in module 'UDebug.exe'. Read of address xxxxxxxx

'UDebug.exe'がアクセスできない領域にアクセスしようとしたためエラー(アクセス違反)が発生しました。

UWSC

「xxxxxxxx」の部分には16進数の値が入ります。今回の場合、10進数の100を16進数に変換した「64」。

UWSC

使い方

Excelでシートの存在確認

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

UWSC

異常発生時にもファイルを閉じる

UWSC