PowerShell中try catch无法捕获Get-Process报错问题咨询
问题根因
- PowerShell 中将异常分为终止异常和非终止异常两类,
try/catch块默认仅能捕获终止异常 Get-Process命令未找到指定ID的进程时,默认抛出的是非终止异常,不会触发catch块,只会直接在控制台输出报错信息
修复方案
要让这类报错被catch块捕获,只需强制将命令的报错转为终止异常即可,常用两种实现方式:
方式1:给单条命令追加错误处理参数
在Get-Process命令后添加 -ErrorAction Stop 参数,仅让该条命令的报错转为终止异常,对其他命令无影响,修改后的代码片段如下:
Get-Process -Id ($Process -split(":") | Select-Object -Last 1) -ErrorAction Stop | Write-Output $_
方式2:修改当前作用域的全局错误处理偏好
如果希望当前脚本内所有命令的报错都触发终止异常,可以在try块的开头添加如下配置:
$ErrorActionPreference = 'Stop'
该配置仅在当前函数/脚本的作用域内生效,不会修改系统全局的PowerShell错误处理规则。
额外优化建议
你当前catch块内直接拼接字符串的写法会将内容输出到管道,若需要直接在控制台打印报错,可以调整为:
catch { Write-Host "Es ist ein Problem aufgetreten: $_" }
$_ 在catch块内可以直接获取到当前触发的异常对象,不需要额外拼接全局的$Error数组。
内容的提问来源于stack exchange,提问作者Keeran
相关产品推荐
相关产品推荐

