主题
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
发现错误: “nonsenseString”一词未被识别为
cmdlet、函数、脚本文件或可操作程序的名称。请检查
该名称的拼写,或者,如果带有路径,则请验证该路径
是否正确,然后再试。
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
“nonsenseString”一词未被识别为
cmdlet、函数、脚本文件或可操作程序的名称。请检查
该名称的拼写,或者,如果带有路径,则请验证该路径
是否正确,然后再试。
位于 C:\PS>testScript1.ps1:3 字符: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
试图除以零。
位于 C:PS> errorX.ps1:3 字符: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:
“NonsenseString”一词未被识别为
cmdlet、函数、脚本文件或可操作程序的名称。请检查
该名称的拼写,或者,如果带有路径,则请验证该路径
是否正确,然后再试。
位于 C:\PS>TestScript1.ps1:3 字符:19
+ NonsenseString <<<<
function1 was completed
该函数中的 Trap 语句捕获错误。在显示该消息后,Windows PowerShell 会继续运行该函数。请注意,
Function1 已完成。
请比较上一示例与下面的示例,下面的示例具有与上一示例相同的错误和 Trap 语句。但在下面的示例中,Trap
语句出现在函数之外:
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
. . .
function2
以后在该脚本中运行 Function2 函数将产生以下结果:
An error:
“NonsenseString”一词未被识别为
cmdlet、函数、脚本文件或可操作程序的名称。请检查
该名称的拼写,或者,如果带有路径,则请验证该路径
是否正确,然后再试。
位于 C:\PS>TestScript2.ps1:4 字符: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
试图除以零。
位于行:4 字符: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