PowerShell 的异常处理

错误类型

在 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)"
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容