主题 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("http://www.contoso.com/MyDoc.doc") } catch [System.Net.WebException],[System.IO.IOException] { "Unable to download MyDoc.doc from http://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