Error 对象

class Error extends Object

Error(错误) 对象是由内置代码在运行时发生错误时抛出的, 也可由脚本显式抛出. 以下是标准属性:

Message: 错误消息.

What: 引起异常的原因. 这通常是一个函数的名称, 但对于由表达式中的错误而抛出的异常(例如在非数字值上使用数学运算符), 则为空白.

Extra: 与错误有关的字符串值(如果有). 如果这个值可以转换为非空字符串, 标准错误对话框会显示一行 "Specifically:" 后面跟着这个字符串.

File: 包含发生错误的行或构造错误对象的脚本文件的完整路径.

Line: 错误发生的行号, 或者错误对象被构造的行号.

Stack: 代表 Error 对象被构造时的调用栈的字符串. 每一行的格式如下:

File (Line) : [What] SourceCode`r`n
代表对函数 What 的调用. FileLine 表示该堆栈深度下的当前脚本行. SourceCode 是该行源代码的近似值, 就像 ListLines 中显示的那样.
> What`r`n
表示线程的启动, 通常是它上面的函数调用的直接原因.
... N more
表示堆栈跟踪被截断, 还有 N 个堆栈条目没有显示. 目前 Stack 属性不能超过 2047 个字符.

注意: 标准错误对话框要求 Message, Extra, FileLine 都是自有值属性.

Error()

创建 Error 对象.

NewError := Error(Message , What, Extra)

Error 可以用 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 的以下子类是预定义的:

也可以使用基 Error 类来抛出 Error.

Throw, Try, Catch, Finally, OnError

unixetc