守护一个或多个语句不受由 Throw 语句抛出的运行时错误和值的影响.
Try Statement
Try
{
Statements
}
Try 语句后常跟着区块, 括在大括号中的一个或多个语句. 如果仅需执行单个语句, 那么此语句可以和 Try 放在同一行, 也可以在下一行, 并且可以省略大括号. 要指定仅在 Try 捕获错误时执行的代码, 请使用一个或多个 Catch 语句.
如果使用 Try 而没有 Catch 或 Finally, 那就相当于一个空的 catch Error.
Throw 语句或程序在运行遇到错误时会抛出值. 当 Try 区块或由其调用的函数抛出值时, 将进行下列操作:
最后一个 Catch 后面可以选择加上 Else. 如果 Try 语句完成后没有抛出异常(并且没有通过 Return, Break 或类似的方式将控制权转移到其他地方), 则会执行 Else 语句. 由 Else 语句抛出的异常不会被其相关的 Try 语句处理, 但可以被一个包围的 Try 语句处理. Finally 也可以出现, 但是必须放在 Else 之后, 而且总是最后执行.
如果在没有 try 区块执行的情况下引发异常, 则会显示错误消息, 并且当前线程退出.
可以选择将 One True Brace(OTB) 样式与 try 语句一起使用. 例如:
try {
...
} catch Error as err {
...
} else {
...
} finally {
...
}
Throw, Catch, Else, Finally, 区块, OnError
try ; 尝试执行的代码.
{
HelloWorld
MakeToast
}
catch as e ; 处理由上面区块抛出的首个错误.
{
MsgBox "An error was thrown!`nSpecifically: " e.Message
Exit
}
HelloWorld() ; 总是成功.
{
MsgBox "Hello, world!"
}
MakeToast() ; 总是失败.
{
; 立即跳到 try 区块的错误处理程序:
throw Error(A_ThisFunc " is not implemented, sorry")
}
try
{
; 下列语句尝试备份某些指定类型的文件:
FileCopy A_MyDocuments "\*.txt", "D:\Backup\Text documents"
FileCopy A_MyDocuments "\*.doc", "D:\Backup\Text documents"
FileCopy A_MyDocuments "\*.jpg", "D:\Backup\Photos"
}
catch
{
MsgBox "There was a problem while backing the files up!",, "IconX"
ExitApp 1
}
else
{
MsgBox "Backup successful."
ExitApp 0
}
演示使用 Try-Catch 处理 COM 错误. 有关下面使用的 COM 对象的详情, 请参阅 Using the ScriptControl (Microsoft Docs).
try
{
obj := ComObject("ScriptControl")
obj.ExecuteStatement('MsgBox "This is embedded VBScript"') ; 这一行会产生一个 Error.
obj.InvalidMethod() ; 这一行会产生一个 MethodError.
}
catch MemberError ; 包括 MethodError 和 PropertyError.
{
MsgBox "We tried to invoke a member that doesn't exist."
}
catch as e
{
; 关于 e 对象的更多细节, 请参阅 Error 对象.
MsgBox("Exception thrown!`n`nwhat: " e.what "`nfile: " e.file
. "`nline: " e.line "`nmessage: " e.message "`nextra: " e.extra,, 16)
}