# Finally [v1.1.14+]

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

    Finally Statement

    Finally
    {
        Statements
    }

## 备注

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

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

不能使用 Goto, break, continue 和 return 退出 finally 语句, 因为在 try 区块里需要抑制控制流指令. 例如, 如果 try 语句中使用 `return 42`, 值 42 将会在 finally 区块执行后被返回. 如果使用上述命令试图退出 finally 区块将会在加载时或运行时检测为错误.

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

如果脚本被任何方式直接终止, 包括托盘菜单, ExitApp 或 Exit(当脚本不是持续运行的), 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
    }

dftg