</head> <body> <h1>Finally <span class="ver">[v1.1.14+]</span></h1> <p>确保在 <a href="Try.htm">Try</a> 语句完成后总是会执行一个或多个<a href="../Concepts.htm#statement">语句</a>.</p> <pre class="Syntax"><span class="func">Finally</span> <i>Statement</i></pre> <pre class="Syntax" style="line-height: 100%"> <span class="func">Finally</span> { <i>Statements</i> } </pre> <h2 id="Remarks">备注</h2> <p>每次使用 <em>Finally</em> 都必须附属于(与之关联) 它上面的 <a href="Try.htm">Try</a>(或 <a href="Catch.htm">Catch</a>) 语句. <em>Finally</em> 总是附属于它上面且离它最近的无主 <em>Try</em> 语句, 不过可以使用<a href="Block.htm">区块</a>改变这种行为.</p> <p><em>Try</em> 语句的行为取决于 <em>Catch</em> 或 <em>Finally</em> 是否存在. 更多细节请参阅 <a href="Try.htm">Try</a>.</p> <p>不能使用 <em>Goto</em>, <em>Break</em>, <em>Continue</em> 和 <em>Return</em> 退出 <em>Finally</em> 语句, 因为在 <em>Try</em> 区块里需要抑制控制流语句. 例如, 如果 <em>Try</em> 语句中使用 <code>return 42</code>, 值 42 将会在 <em>Finally</em> 区块执行后被返回. 如果使用上述语句试图退出 <em>Finally</em> 区块将会在加载时或运行时检测为错误.</p> <p>在 <span class="ver">[v1.1.19.02]</span> 之前的版本中, 存在一个 bug, 当 <em>Finally</em> 语句存在时, <em>Try</em> 里的控制流语句可能不会执行. <em>Return</em> 被错误地允许在 <em>Finally</em> 语句中使用, 但是如果有一个异常抛出时它将会被忽略.</p> <p>如果脚本被任何方式直接终止, 包括托盘菜单, <a href="ExitApp.htm">ExitApp</a> 或 <a href="Exit.htm">Exit</a>(当脚本不是<a href="_Persistent.htm">持续运行的</a>), <em>Finally</em> 语句不会被执行. 然而, 如果只有当前<a href="../misc/Threads.htm">线程</a>(而不是整个脚本) 正在退出, 那么 <em>Finally</em> 语句将被执行.</p> <p><a href="Block.htm#otb">One True Brace(OTB) 风格</a>可以用于 <em>Finally</em> 命令中. 例如:</p> <pre>try { ... } finally { ... } try { ... } catch e { ... } finally { ... }</pre> <h2 id="Related">相关</h2> <p><a href="Try.htm">Try</a>, <a href="Catch.htm">Catch</a>, <a href="Throw.htm">Throw</a>, <a href="Block.htm">区块</a></p> <h2 id="Examples">示例</h2> <div class="ex" id="ExBasic"> <p><a class="ex_number" href="#ExBasic"></a> 详细演示 <em>Finally</em> 的行为.</p> <pre>try { ToolTip, Working... Example1() } catch e { <em>; 关于 e 对象的更多细节, 请参阅 <a href="Catch.htm">Catch</a>.</em> MsgBox, 16,, % "Exception thrown!`n`nwhat: " e.what "`nfile: " e.file . "`nline: " e.line "`nmessage: " e.message "`nextra: " e.extra } finally { ToolTip <em>; 隐藏 ToolTip</em> } MsgBox, Done! <em>; 此函数包含了清理代码的 Finally 区块</em> Example1() { try Example2() finally MsgBox, This is always executed regardless of exceptions } <em>; 当系统分钟数为奇数时此函数执行会报错</em> Example2() { if Mod(A_Min, 2) throw Exception("Test exception") MsgBox, Example2 did not fail }</pre> </div> </body> </html>