Errorオブジェクト

class Error extends Object

Errorオブジェクトは、実行時エラーが発生したときに組み込みコードによってスローされ、またスクリプトによって明示的にスローされることもある。

目次

Standard Properties

Message:エラーメッセージです。

What:何が例外を発生させたか。これは通常、関数の名前ですが、式のエラー(数値以外の値で数学演算子を使用した場合など)によりスローされる例外の場合は空白になります。

Extra:エラーに関連する文字列がある場合、その値。この値が空でない文字列に変換できる場合、標準エラーダイアログは、"Specifically:"の後にこの文字列を含む行を表示します。

File:エラーが発生した行、または Error オブジェクトが構築された行を含むスクリプトファイルのフルパス。

Line:エラーが発生した行番号、またはErrorオブジェクトが構築された行番号です。

Stack:Errorオブジェクトが構築された時点のコールスタックを表す文字列です。各行の書式は、次のようにすることができる:

File (Line) : [What] SourceCode`r`n
関数Whatの呼び出しを表します。FileLineは、このスタックの深さにおける現在のスクリプト行を示します。SourceCodeは、ListLinesに表示されるような、その行のソースコードの近似値です。
> What`r`n
スレッドの起動を表し、通常、その上の関数呼び出しの直接の原因となるものです。
... N more
スタックトレースが切り捨てられ、表示されていないスタック項目がN個以上あることを示します。現在、Stackプロパティは2047文字を超えることはできません。

注:標準エラーダイアログでは、MessageExtraFileLine独自の値プロパティであることが必要です。

Error()

Error オブジェクトを作成します。

NewError := Error(Message , What, Extra)

Errorは、「エラータイプ」に記載されているサブクラスのいずれかに置き換えることができる。ただし、サブクラスによっては、異なるパラメータを取る場合もあります。

パラメータは上記のプロパティに直接対応しますが、__NewメソッドをオーバーライドするErrorサブクラスでは異なる場合があります。

MessageExtraは文字列に変換されます。例外が発生し、捕捉されなかった場合は、エラーダイアログで表示されます。

What エラーの原因を示します。任意の文字列を指定できますが、負整数または実行中の関数名である必要があります。1を指定すると現在の関数、-2を指定するとその関数を呼び出した関数、といった具合です。スクリプトがコンパイルされたり、値が有効なスタックフレームを特定できない場合、値は単に文字列に変換され、NewError.Whatに代入されます。それ以外の場合は、特定されたスタックフレームを以下のように使用して、他のプロパティを決定します:

Whatパラメータを使用すると、複雑な関数がヘルパー関数を使用して作業やパラメータの検証を行い、報告されるエラー情報からはそれらの内部詳細を省くことができます。事例:

MyFunction(a, b) {
    CheckArg "a", a
    CheckArg "b", b
    ;...
    CheckArg(name, value) {
        if value < 0
            throw ValueError(name " is negative", "myfunction", value)
    }
}

try
    MyFunction(1, -1)  ; err.Lineはこの行を示します。
catch ValueError as err
    MsgBox Format("{1}: {2}.`n`nFile:`t{3}`nLine:`t{4}`nWhat:`t{5}`nStack:`n{6}"
        , type(err), err.Message, err.File, err.Line, err.What, err.Stack)
try
    SomeFunction()
catch as e
    MsgBox(type(e) " in " e.What ", which was called at line " e.Line)

SomeFunction() {
    throw Error("Fail", -1)
}

エラータイプ

Errorのサブクラスとして、以下のものが予め定義されています:

また、エラーは、ベースとなるErrorクラスを使用してスローされます。

ThrowTryCatchFinallyOnError