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