# Error 对象

    class Error extends Object

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

## 目录

- 标准属性
- Error()
- Error 类型
- 相关

## 标准属性

Message: 错误消息.

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

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

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

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

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

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

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

## Error()

创建 Error 对象.

    NewError := Error(Message , What, Extra)

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

这些参数直接对应于上面描述的属性, 但对于覆盖 __New 方法的 Error 子类来说, 参数可能有所不同.

Message 和 Extra 被转换为字符串. 如果一个异常抛出而且没有被捕获, 则会通过一个错误对话框来显示它们.

What 指示错误的来源. 它可以是任意字符串, 但应该是负整数或正在运行的函数的名称. 指定 -1 表示当前函数, -2 表示调用它的函数, 依此类推. 如果脚本被编译或者该值不能识别有效的堆栈帧, 那么该值将被转换为字符串并赋值给 `NewError.What`. 否则, 将使用标识的堆栈帧来确定其他属性:

- `NewError.What` 包含函数的名称.
- `NewError.Line` 和 `NewError.File` 表示 调用 函数的行.
- `NewError.Stack` 包含部分堆栈跟踪, 在顶部指示堆栈帧.

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

- MemoryError(内存错误): 内存分配失败.
- OSError(系统错误): 对 Win32 函数的内部函数调用失败. Message 包括操作系统生成的错误码和描述. OSErrors 有一个额外的 Number 属性, 其中包含错误代码. 使用数字 code 调用 `OSError(code)`, 会基于给定的 OS(系统) 定义的错误代码设置 Number ` Message. 如果 code 被省略, 则默认为 `A_LastError`.
- TargetError(目标错误): 函数由于找不到目标而失败. Message 指示目标的类型, 例如窗口, 控件, 菜单或状态栏.
- TimeoutError(超时错误): SendMessage 超时.
- TypeError(类型错误): 意外的值类型被用作函数, 属性赋值或其他操作的输入. 通常 Message 指示预期的和实际的类型, 而 Extra 包含一个表示错误值的字符串.
- ValueError(值错误): 意外的值被用作函数, 属性赋值或其他操作的输入. 通常 Message 指示哪个期望值被打破, 而 Extra 包含一个表示错误值的字符串.
- UnsetError: 尝试读取变量, 属性或项的值, 但没有值.
  - MemberError(成员错误)
    - PropertyError
    - MethodError
  - UnsetItemError
- ValueError: 一个意外的值被用作函数, 属性赋值或其他操作的输入. 通常 Message 表示哪个期望不和预期, 而 Extra 包含一个表示错误值的字符串.
  - IndexError(索引错误): 对象的 __Item 属性的 index 参数无效或超出范围.
- ZeroDivisionError(零除错误): 在表达式或 Mod 函数中试图除以零.

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

## 相关

Throw, Try, Catch, Finally, OnError

dftg