Finally

AutoHotKey

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 语句中使用, 但是如果有一个异常抛出时它将会被忽略.

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

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

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

相关

Try, Catch, Throw, 区块

示例

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 ; 隐藏工具提示
}

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
}