</head> <body> <h1>Error 对象</h1> <pre class="NoIndent">class Error extends Object</pre> <p>Error(错误) 对象是由内置代码在运行时发生错误时<a href="Throw.htm">抛出的</a>, 也可由脚本显式抛出. 以下是标准属性.</p> <h2 id="toc">目录</h2> <ul> <li><a href="#Standard_Properties">标准属性</a></li> <li><a href="#new">Error()</a></li> <li><a href="#error-types">Error 类型</a></li> <li><a href="#Related">相关</a></li> </ul> <h2 id="Standard_Properties">标准属性</h2> <p id="Message"><strong>Message:</strong> 错误消息.</p> <p id="What"><strong>What:</strong> 引起异常的原因. 这通常是一个函数的名称, 但对于由表达式中的错误而抛出的异常(例如在非数字值上使用数学运算符), 则为空白.</p> <p id="Extra"><strong>Extra:</strong> 与错误有关的字符串值(如果有). 如果这个值可以转换为非空字符串, 标准错误对话框会显示一行 "Specifically:" 后面跟着这个字符串.</p> <p id="File"><strong>File:</strong> 包含发生错误的行或构造错误对象的脚本文件的完整路径.</p> <p id="Line"><strong>Line:</strong> 错误发生的行号, 或者错误对象被构造的行号.</p> <p id="Stack"><strong>Stack:</strong> 代表 Error 对象被构造时的调用栈的字符串. 每一行的格式如下:</p> <dl> <dt><code><i>File</i> (<i>Line</i>) : [<i>What</i>] <i>SourceCode</i>`r`n</code></dt> <dd>代表对函数 <em>What</em> 的调用. <em>File</em> 和 <em>Line</em> 表示该堆栈深度下的当前脚本行. <em>SourceCode</em> 是该行源代码的近似值, 就像 <a href="ListLines.htm">ListLines</a> 中显示的那样.</dd> <dt><code>&gt; <i>What</i>`r`n</code></dt> <dd>表示线程的启动, 通常是它上面的函数调用的直接原因.</dd> <dt><code>... <i>N</i> more</code></dt> <dd>表示堆栈跟踪被截断, 还有 <em>N</em> 个堆栈条目没有显示. 目前 <code>Stack</code> 属性不能超过 2047 个字符.</dd> </dl> <p class="warning"><strong>注意:</strong> 标准错误对话框要求 <em>Message</em>, <em>Extra</em>, <em>File</em> 和 <em>Line</em> 都是<a href="Object.htm">自有值属性</a>.</p> <h2 id="new">Error()</h2> <p>创建 Error 对象.</p> <pre class="Syntax">NewError := <span class="func"><i>Error</i></span>(Message <span class="optional">, What, Extra</span>)</pre> <p><em><strong>Error</strong></em> 可以用 <a href="#error-types">Error 类型</a>中列出的某个子类替换, 尽管一些子类可能会采用不同的参数.</p> <p>这些参数直接对应于上面描述的属性, 但对于覆盖 __New 方法的 Error 子类来说, 参数可能有所不同.</p> <p><em>Message</em> 和 <em>Extra</em> 被转换为字符串. 如果一个异常抛出而且没有被捕获, 则会通过一个错误对话框来显示它们.</p> <p><em>What</em> 指示错误的来源. 它可以是任意字符串, 但应该是负整数或正在运行的函数的名称. 指定 -1 表示当前函数, -2 表示调用它的函数, 依此类推. 如果脚本被<a href="../Scripts.htm#ahk2exe">编译</a>或者该值不能识别有效的堆栈帧, 那么该值将被转换为字符串并赋值给 <code>NewError.What</code>. 否则, 将使用标识的堆栈帧来确定其他属性:</p> <ul> <li><code>NewError.What</code> 包含函数的名称.</li> <li><code>NewError.Line</code> 和 <code>NewError.File</code> 表示 <em>调用</em> 函数的行.</li> <li><code>NewError.Stack</code> 包含部分堆栈跟踪, 在顶部指示堆栈帧.</li> </ul> <p>使用 <em>What</em> 参数可以允许复杂函数使用帮助函数来执行其工作或参数验证, 同时从任何报告的错误信息中忽略这些内部细节. 例如:</p> <pre>MyFunction(a, b) { CheckArg "a", a CheckArg "b", b <em>;...</em> CheckArg(name, value) { if value &lt; 0 throw ValueError(name " is negative", "myfunction", value) } } try MyFunction(1, -1) <em>; err.Line 显示为这一行.</em> 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)</pre> <pre>try SomeFunction() catch as e MsgBox(type(e) " in " e.What ", which was called at line " e.Line) SomeFunction() { throw Error("Fail", -1) }</pre> <h2 id="error-types">Error 类型</h2> <p><strong>Error</strong> 的以下子类是预定义的:</p> <ul> <li id="MemoryError"><strong>MemoryError(内存错误):</strong> 内存分配失败.</li> <li id="OSError"><strong>OSError(系统错误):</strong> 对 Win32 函数的内部函数调用失败. <strong>Message</strong> 包括操作系统生成的错误码和描述. OSErrors 有一个额外的 <strong>Number</strong> 属性, 其中包含错误代码. 调用 <code>OSError(Code)</code>, 其中 <em>Code</em> 是数字, 根据给定的 OS(系统) 定义的错误代码设置 <em>Number</em> 和 <em>Message</em>. 如果省略 <em>Code</em>, 则默认为 <a href="../Variables.htm#LastError">A_LastError</a>. 例如, <code>OSError(5).Message</code> 返回 "(5) 禁止访问."</li> <li id="TargetError"><strong>TargetError(目标错误):</strong> 函数由于找不到目标而失败. <strong>Message</strong> 指示目标的类型, 例如窗口, 控件, 菜单或状态栏.</li> <li id="TimeoutError"><strong>TimeoutError(超时错误):</strong> <a href="SendMessage.htm">SendMessage</a> 超时.</li> <li id="TypeError"><strong>TypeError(类型错误):</strong> 意外的值类型被用作函数, 属性赋值或其他操作的输入. 通常 <strong>Message</strong> 指示预期的和实际的类型, 而 <strong>Extra</strong> 包含一个表示错误值的字符串.</li> <li id="ValueError"><strong>ValueError(值错误):</strong> 意外的值被用作函数, 属性赋值或其他操作的输入. 通常 <strong>Message</strong> 指示哪个期望值被打破, 而 <strong>Extra</strong> 包含一个表示错误值的字符串.</li> <li id="UnsetError"><strong>UnsetError:</strong> 尝试读取变量, 属性或项的值, 但没有值.<ul> <li id="MemberError"><strong>MemberError(成员错误)</strong><ul> <li id="PropertyError"><strong>PropertyError</strong></li> <li id="MethodError"><strong>MethodError</strong></li> </ul></li> <li id="UnsetItemError"><strong>UnsetItemError</strong></li> </ul></li> <li id="ValueError"><strong>ValueError:</strong> 一个意外的值被用作函数, 属性赋值或其他操作的输入. 通常 <strong>Message</strong> 表示哪个期望不和预期, 而 <strong>Extra</strong> 包含一个表示错误值的字符串.<ul> <li id="IndexError"><strong>IndexError(索引错误):</strong> 对象的 <a href="../Objects.htm#__Item">__Item 属性</a>的 index 参数无效或超出范围.</li> </ul></li> <li id="ZeroDivisionError"><strong>ZeroDivisionError(零除错误):</strong> 在表达式或 Mod 函数中试图除以零.</li> </ul> <p>也可以使用基 Error 类来抛出 Error.</p> <h2 id="Related">相关</h2> <p><a href="Throw.htm">Throw</a>, <a href="Try.htm">Try</a>, <a href="Catch.htm">Catch</a>, <a href="Finally.htm">Finally</a>, <a href="OnError.htm">OnError</a></p> </body> </html>