Finally [v1.1.14+]

确保在 Try 语句完成后总是会执行一个或多个语句.

Finally Statement
Finally
{
    Statements
}

备注

每次使用 Finally 都必须附属于(与之关联) 它上面的 Try(或 Catch) 语句. Finally 总是附属于它上面且离它最近的无主 Try 语句, 不过可以使用区块改变这种行为.

Try 语句的行为取决于 CatchFinally 是否存在. 更多细节请参阅 Try.

不能使用 Goto, Break, ContinueReturn 退出 Finally 语句, 因为在 Try 区块里需要抑制控制流语句. 例如, 如果 Try 语句中使用 return 42, 值 42 将会在 Finally 区块执行后被返回. 如果使用上述语句试图退出 Finally 区块将会在加载时或运行时检测为错误.

[v1.1.19.02] 之前的版本中, 存在一个 bug, 当 Finally 语句存在时, Try 里的控制流语句可能不会执行. Return 被错误地允许在 Finally 语句中使用, 但是如果有一个异常抛出时它将会被忽略.

如果脚本被任何方式直接终止, 包括托盘菜单, ExitAppExit(当脚本不是持续运行的), Finally 语句不会被执行. 然而, 如果只有当前线程(而不是整个脚本) 正在退出, 那么 Finally 语句将被执行.

One True Brace(OTB) 风格可以用于 Finally 命令中. 例如:

try {
    ...
} finally {
    ...
}

try {
    ...
} catch e {
    ...
} finally {
    ...
}

Try, Catch, Throw, 区块

示例

详细演示 Finally 的行为.

try
{
    ToolTip, Working...
    Example1()
}
catch e
{
    ; 关于 e 对象的更多细节, 请参阅 Catch.
    MsgBox, 16,, % "Exception thrown!`n`nwhat: " e.what "`nfile: " e.file
        . "`nline: " e.line "`nmessage: " e.message "`nextra: " e.extra
}
finally
{
    ToolTip ; 隐藏 ToolTip
}

MsgBox, Done!

; 此函数包含了清理代码的 Finally 区块
Example1()
{
    try
        Example2()
    finally
        MsgBox, This is always executed regardless of exceptions
}

; 当系统分钟数为奇数时此函数执行会报错
Example2()
{
    if Mod(A_Min, 2)
        throw Exception("Test exception")
    MsgBox, Example2 did not fail
}