错误类型
在 PowerShell 中,执行流程被意外打断的事件称为“异常”。当异常未被捕获时,它会被包装为错误信息呈现给用户。错误主要分为两类:终止错误会完全停止代码执行;而非终止错误则允许脚本在报告错误后继续运行。许多内置 cmdlet 默认将异常作为非终止错误处理。
-ErrorAction 参数
-ErrorAction 是 PowerShell 中一个通用的参数,可用于任何 cmdlet,用于控制其遇到非终止错误时的行为。可选的参数及其行为如下:
| 参数 | 含义 |
|---|---|
Ignore |
继续执行 cmdlet,但不输出错误,也不将其记录在 $Error 变量中。 |
SilentlyContinue |
继续执行 cmdlet,不输出错误,但将其记录在 $Error 变量中。 |
Continue |
输出错误消息并继续执行 cmdlet。这是默认值。 |
Inquire |
输出错误消息,并在继续之前提示用户输入。 |
Stop |
输出错误消息并停止执行 cmdlet。 |
Get-Process -Name "foo" -ErrorAction Stop
这段代码尝试获取名为 foo 的进程。由于不存在这样的进程,Get-Process 默认会产生一个非终止错误。通过指定 -ErrorAction Stop,强制将该错误升级为终止错误,能够立即停止当前命令的执行,并可由后续的 try/catch 结构捕获。
$ErrorActionPreference 变量
$ErrorActionPreference 是一个自动变量,用于设置当前会话中所有命令的默认错误行为偏好。
$ErrorActionPreference = 'Stop'
Get-Process -Name "foo"
此例首先将 $ErrorActionPreference 设置为 'Stop'。在此之后,尝试查找一个不存在的进程,原本的 Get-Process 命令只会产生非终止错误并继续执行,但现在它会抛出终止错误并中断执行流程。
异常捕获
try/catch/finally 是 PowerShell 中用于捕获和处理终止错误的核心结构。
try {
# 尝试执行可能失败的操作
Get-Process -Name "foo" -ErrorAction Stop
Write-Host "Precess is found successfully."
} catch {
# 当 try 块中出现终止错误时,执行此处的代码
Write-Host "An error occurred: $($_.Exception.Message)"
} finally {
# 无论是否出错,都会执行的清理代码
Write-Host "This cleanup message always appears."
}
这个例子在 try 块内尝试获取一个不存在的进程。由于 -ErrorAction Stop 的设定,进程未找到的错误会变为终止错误并被 catch 块捕获。错误对象存储在 $_ 中,要想获取具体错误信息,需要访问 $_.Exception.Message 属性。最后,无论成功与否,finally 块中的信息都会被输出。
$Error 自动变量
$Error 是一个数组类型的自动变量,它按时间倒序记录了当前会话中发生的所有错误(包括终止和非终止错误)。
# 一些会产生错误的命令
Get-Process -Name "foo"
Get-Process -Name "bar"
# 通过 $Error[0] 访问最近发生的错误对象
$latestError = $Error[0]
# 获取错误的具体信息
Write-Host "The most recent error is: $latestError"
Write-Host "Error Message: $($latestError.Exception.Message)"
Write-Host "Error Type: $($latestError.Exception.GetType().FullName)"