主题
    about_Trap

简短说明
    介绍用于处理终止错误的关键字。


详细说明
    终止错误会停止语句运行。如果 Windows PowerShell 不以某些方式处理终止错误,Windows PowerShell 
    还会停止运行当前管道中的函数或脚本。在其他语言(如 C#)中,将终止错误称为异常。


    Trap 关键字指定在出现终止错误时要运行的语句列表。Trap 语句用于处理终止错误并允许继续而不是
    停止执行脚本或函数。


  语法

      Trap 语句的语法如下:

          trap [[<error type>]] {<statement list>}


      Trap 语句中包含在出现终止错误时要运行的语句列表。Trap 关键字可以选择指定错误类型。
      错误类型需要用方括号括起。


      一个脚本或命令可具有多个 Trap 语句。Trap 语句可出现在脚本或命令中的任何位置。


  捕获所有终止错误

      当脚本或命令中出现未另作处理的终止错误时,Windows PowerShell 会检查是否存在可处理该错误的 Trap 
      语句。如果存在 Trap 语句,Windows PowerShell 会继续运行 Trap 语句中的脚本或命令。
 

      以下示例是一个非常简单的 Trap 语句:

          trap {"Error found."}


      此 Trap 语句可捕获任何终止错误。以下示例是包含此 Trap 语句的一个函数:

          function TrapTest {
              trap {"Error found."}
              nonsenseString
              }


      此函数包含一个会导致错误的无用字符串。运行此函数会返回以下结果:

          C:\PS> TrapTest
          Error found.


      以下示例包含一个 Trap 语句,该语句使用 $_ 自动变量显示错误:

          function TrapTest {
              trap {"Error found: $_"}
              nonsenseString
              }


      运行此版本的函数会返回以下结果:

          C:\PS> TrapTest
          Error found: The term 'nonsenseString' is not recognized as the name 
          of a cmdlet, function, script file, or operable program. Check the 
          spelling of the name, or if a path was included verify that the path 
          is correct, and then try again.


      Trap 语句还可以更复杂。Trap 语句可包含多个条件或函数调用。它可以记录、测试甚至运行其他程序。


   捕获指定的终止错误

      下例所示 Trap 语句可捕获 CommandNotFoundException 错误类型:

          trap [System.Management.Automation.CommandNotFoundException] 
              {"Command error trapped"}


      当函数或脚本遇到与已知命令不匹配的字符串时,此 Trap 语句会显示"Command error trapped"字符
      串。在运行 Trap 语句列表中的所有语句之后,Windows PowerShell 会将错误对象写入错误流然后继续运行
      脚本。


      Windows PowerShell 使用 Microsoft .NET Framework 异常类型。以下示例指定 
      System.Exception 错误类型:

          trap [System.Exception] {"An error trapped"}


      CommandNotFoundException 错误类型继承自 System.Exception 类型。此语句捕获由未知命令产生的错
      误,还捕获其他类型的错误。


      一个脚本中可以有多个 Trap 语句。每个错误只能由一个 Trap 语句捕获。如果出现错误,并且有多个 Trap 
      语句可用,则 Windows PowerShell 会使用包含与该错误最精确匹配的错误类型的 Trap 语句。


      下面的脚本示例包含一个错误。该脚本包含一个可捕获任何终止错误的常规 Trap 语句,以及一个指定了 
      CommandNotFoundException 类型的特定 Trap 语句。

          trap {"Other terminating error trapped" }
          trap [System.Management.Automation.CommandNotFoundException] {"Command error trapped"}
          nonsenseString


      运行此脚本将产生以下结果:

          Command  error trapped
          The term 'nonsenseString' is not recognized as the name of a cmdlet, 
          function, script file, or operable program. Check the spelling of 
          the name, or if a path was included verify that the path is correct,
          and then try again.
          At C:\PS>testScript1.ps1:3 char:19
          +     nonsenseString <<<<


      由于 Windows PowerShell 不会将"nonsenseString"识别为 cmdlet 或其他项目,因此它会返回 
      CommandNotFoundException 错误。此终止错误被特定 Trap 语句捕获。


      以下脚本示例包含相同的 Trap 语句但指定了不同的错误:

          trap {"Other terminating error trapped" }
          trap [System.Management.Automation.CommandNotFoundException] 
              {"Command error trapped"}
          1/$null


      运行此脚本将产生以下结果:

          Other terminating error trapped
          Attempted to divide by zero.
          At C:PS> errorX.ps1:3 char:7
          +   1/ <<<< $null


      除以零操作不产生 CommandNotFoundException 错误。该错误由另一可捕获任何终止错误的 Trap 语句捕获。


  捕获错误和作用域

      如果终止错误出现的作用域与 Trap 语句的作用域相同,则在运行 Trap 语句后,Windows PowerShell 会
      继续执行错误后的语句。如果 Trap 语句与错误处在不同的作用域中,则会继续执行与 Trap 语句处在同一作用
      域的下一条语句。
 

      例如,如果函数中出现一个错误,并且 Trap 语句也在该函数中,则脚本会继续执行下一条语句。例如,下面的
      脚本包含一个错误和一条 Trap 语句:

          function function1 {
              trap { "An error: " }
              NonsenseString
              "function1 was completed"
              }


      以后在该脚本中运行 Function1 函数将产生以下结果:

          function1
          An error: 
          The term 'NonsenseString' is not recognized as the name of a cmdlet, 
          function, script file, or operable program. Check the spelling of the 
          name, or if a path was included verify that the path is correct, and 
          then try again.
          At C:\PS>TestScript1.ps1:3 char:19
          +     NonsenseString <<<<

          function1 was completed
 

      该函数中的 Trap 语句捕获错误。在显示该消息后,Windows PowerShell 会继续运行该函数。请注意,
      Function1 已完成。


      请比较上一示例与下面的示例,下面的示例具有与上一示例相同的错误和 Trap 语句。但在下面的示例中,Trap 
      语句出现在函数之外:

          function function2 {
              NonsenseString
              "function2 was completed"
              }

          trap { "An error: " }
              . . .
          function2


      以后在该脚本中运行 Function2 函数将产生以下结果:

          An error: 
          The term 'NonsenseString' is not recognized as the name of a cmdlet, 
          function, script file, or operable program. Check the spelling of the 
          name, or if a path was included verify that the path is correct, and 
          then try again.
          At C:\PS>TestScript2.ps1:4 char:19
          +     NonsenseString <<<<


      在此示例中,"function2 was completed"命令没有运行。虽然两个终止错误都出现在函数之内,但如果 
      Trap 语句在函数之外,则在 Trap 语句运行后 Windows PowerShell 不会返回到函数中。


  使用 Break 和 Continue 关键字

      可以在 Trap 语句中使用 Break 和 Continue 关键字来确定在发生终止错误后脚本或命令是否继续运行。


      如果在 Trap 语句列表中包括 Break 语句,Windows PowerShell 会停止函数或脚本。下面的示例函数在 
      Trap 语句中使用 Break 关键字:

          C:\PS> function break_example {
              trap {"Error trapped"; break;}
              1/$null
              "Function completed."
              }

          C:\PS> break_example
          Error trapped
          Attempted to divide by zero.
          At line:4 char:7


      由于该 Trap 语句包含了 Break 关键字,因此该函数不会继续运行,"Function completed"行没有运行。


      如果在 Trap 语句中包括 Continue 语句,Windows PowerShell 会在导致错误的语句之后继续运行,就像
      没有使用 Break 或 Continue 一样。但是,如果使用 Continue 关键字,Windows PowerShell 不会将错
      误写入错误流。


      下面的示例函数在 Trap 语句中使用 Continue 关键字:

          C:\PS> function continue_example {
              trap {"Error trapped"; continue;} 1/$null
              "Function completed."}

          C:\PS> continue_example
          Error trapped
          Function completed.


      该函数会在捕获错误后继续运行,并且"Function completed"语句会运行。任何错误都不会被写入错误流。


另请参阅
    about_Break
    about_Continue
    about_Throw
    about_Try_Catch_Finally
    about_Scopes




目录