about_Try_Catch_Finally
主题
about_Try_Catch_Finally
简短说明
说明如何使用 Try、Catch 和 Finally 块处理终止错误。
详细说明
在脚本中,可用 Try、Catch 和 Finally 块来响应或处理终止错误。在脚本中也可用 Trap 语句来
处理终止错误。有关详细信息,请参阅 about_Trap。
终止错误会停止语句运行。如果 Windows PowerShell 不以某些方式处理终止错误,Windows
PowerShell 还会停止运行当前管道中的函数或脚本。在其他语言(如 C#)中,将终止错误称为异
常。有关错误的详细信息,请参阅 about_Errors。
使用 Try 块可定义一段脚本,让 Windows PowerShell 监视错误。如果 Try 块内发生错误,则
首先将错误保存到 $Error 自动变量中。然后,Windows PowerShell 搜索 Catch 块来处理这一
错误。如果 Try 语句没有匹配的 Catch 块,则 Windows PowerShell 继续在父作用域中搜索适当
的 Catch 块或 Trap 语句。完成 Catch 块后,或者未找到适当的 Catch 块或 Trap 语句,则运
行 Finally 块。如果错误无法处理,则将错误写入错误流。
Catch 块可以包含用于跟踪故障或恢复预期脚本流的命令。Catch 块可以指定要捕捉的错误类型。
Try 语句可以包含多个 Catch 块,分别用于不同类型的错误。
Finally 块可用来释放脚本不再需要的所有资源。
Try、Catch 和 Finally 与 C# 编程语言中的 Try、Catch 和 Finally 关键字相似。
语法
Try 语句包含一个 Try 块,零个或多个 Catch 块,以及零个或一个 Finally 块。Try 语句必
须至少包含一个 Catch 块或一个 Finally 块。
下面说明 Try 块的语法:
try {<statement list>}
Try 关键字后紧跟用大括号括起来的语句列表。如果语句列表中的语句在运行时发生终止错误,则脚
本将错误对象从 Try 块传递到适当的 Catch 块。
下面说明 Catch 块的语法:
catch [[<error type>][',' <error type>]*] {<statement list>}
错误类型用方括号括起。最外层的方括号表明该元素是可选的。
Catch 关键字后面是可选的错误类型列表和语句列表。如果 Try 块中发生终止错误,Windows
PowerShell 就会搜索适当的 Catch 块。假如找到,则运行该 Catch 块中的语句。
Catch 块可以指定一个或多个错误类型。错误类型是 Microsoft .NET Framework 异常或者
从 .NET Framework 异常派生的异常。Catch 块处理指定的 .NET Framework 异常类的错误或
任何从指定类派生的类的错误。
如果 Catch 块指定一个错误类型,则该 Catch 块处理这一类型的错误。如果 Catch 块没有指
定错误类型,则该 Catch 块处理 Try 块中发生的所有错误。Try 语句可以包含多个 Catch 块,
分别用于不同的指定错误类型。
下面说明 Finally 块的语法:
finally {<statement list>}
Finally 关键字后面是语句列表,在每次运行脚本时,即使运行 Try 语句时没有发生错误或者
Catch 语句中捕捉到错误,都会运行该语句列表。
注意,按 Ctrl+C 可停止管道。发送到管道的对象不会显示为输出。因此,如果要显示一句话(如
"Finally block has run"),即使 Finally 块运行,按 Ctrl+C 后也不会显示这句话。
捕捉错误
以下示例脚本说明带有 Catch 块的 Try 块:
try { NonsenseString }
catch { "An error occurred."}
Catch 关键字必须紧跟在 Try 块或另一个 Catch 块之后。
Windows PowerShell 不会将"NonsenseString"识别为 cmdlet 或其他项目。在运行此脚本后,
将返回以下结果:
An error occurred.
当脚本遇到"NonsenseString"时,会产生终止错误。Catch 块通过运行块内的语句列表处理这
一错误。
使用多个 Catch 语句
一条 Try 语句可以有任意数量的 Catch 块。例如,下面的脚本有一个 Try 块,用于下载
MyFile.doc,它包含两个 Catch 块:
try
{
$wc = new-object System.Net.WebClient
$wc.DownloadFile("https://www.contoso.com/MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException]
{
"Unable to download MyDoc.doc from https://www.contoso.com."
}
catch
{
"An error occurred that could not be resolved."
}
第一个 Catch 块处理 System.Net.WebException 和 System.IO.IOException 类型的错
误。第二个 Catch 块没有指定错误类型。第二个 Catch 块处理发生的所有其他终止错误。
Windows PowerShell 通过继承匹配错误类型。Catch 块处理指定的 .NET Framework 异常类的
错误或任何从指定类派生的类的错误。下面的示例包含一个 Catch 块,用于捕捉"Command Not
Found"错误:
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
指定的错误类型 CommandNotFoundException 是从 System.SystemException 类型继承而
来。下面的示例也捕捉"Command Not Found"错误:
catch [System.SystemException] {"Base Exception" }
该 Catch 块处理"Command Not Found"错误以及其他从 SystemException 类型继承的错误。
如果要指定错误类及其一个派生类,请将该派生类的 Catch 块放在常规类的 Catch 块之前。
使用 Finally 释放资源
要释放脚本使用的资源,请在 Try 和 Catch 块之后添加一个 Finally 块。无论 Try 块是否遇到
终止错误,Finally 块语句都会运行。Windows PowerShell 在脚本终止之前或当前块超出作用
域之前运行 Finally 块。
即使按 Ctrl+C 停止脚本,Finally 块也会运行。如果 Catch 块内的 Exit 关键字停止脚本,
Finally 块还是会运行。
另请参阅
about_Errors
about_Trap