Error 对象

class Error extends Object

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

错误对象可通过 Error() 创建, 并通过 Catch 捕获.

"ErrorObj" 作为任何错误对象的占位符, 因为 "Error" 为类本身.

除继承自 Object 的方法和属性外, Error 对象还具有以下预定义的方法和属性.

目录

静态方法

Call

创建 Error 对象.

ErrorObj := Error(Message , What, Extra)
ErrorObj := Error.Call(Message , What, Extra)

Error 可以用 Error 类型中列出的某个子类替换, 尽管一些子类可能会采用不同的参数.

这些参数直接对应于属性 Message, WhatExtra, 但对于覆盖 __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)
}

属性

Extra

检索或设置与错误有关的字符串值.

CurrentExtra := ErrorObj.Extra
ErrorObj.Extra := NewExtra

标准错误对话框会显示带有 "Specifically:" 的行, 后面跟着该字符串.

File

检索或设置包含发生错误的行或构造错误对象的脚本文件的完整路径.

CurrentFile := ErrorObj.File
ErrorObj.File := NewFile

Line

检索或设置错误发生的行号, 或者错误对象被构造的行号.

CurrentLine := ErrorObj.Line
ErrorObj.Line := NewLine

Message

检索或设置错误消息.

CurrentMessage := ErrorObj.Message
ErrorObj.Message := NewMessage

Stack

检索或设置代表 Error 对象被构造时的调用栈的字符串.

CurrentStack := ErrorObj.Stack
ErrorObj.Stack := NewStack

每一行的格式如下:

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

What

检索或设置引起异常的原因.

CurrentWhat := ErrorObj.What
ErrorObj.What := NewWhat

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

Error 类型

Error 的以下子类是预定义的:

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

备注

标准错误对话框要求 Message, Extra, File 和 Line 属性是自有值属性.

Throw, Try, Catch, Finally, OnError