主题
    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




目录