PowerShell的CommandNotFoundException是终止性错误吗?
原因解析
这个差异是PowerShell的错误分级机制和try/catch的捕获逻辑共同导致的:
- 首先你观察到的第一个现象是对的:
CommandNotFoundException默认属于语句终止错误,这类错误只会中断当前出错的单条语句的执行,不会影响后续语句运行,所以直接执行脚本时,报错后依然会打印Hello。 try/catch块的捕获范围包含所有终止类错误(包括语句终止错误、全局终止错误),所以当你把nonexistingcommand放到try块内时,它抛出的语句终止错误会被匹配的catch块捕获。- 你在
catch块内调用了throw语句,这个操作会把捕获到的语句终止错误,升级为全局终止错误,这类错误会直接终止整个脚本的运行,自然就不会执行后续的echo "Hello"语句。
验证示例
你可以修改代码验证这个逻辑,比如去掉catch块内的throw:
try { nonexistingcommand } catch [System.Management.Automation.CommandNotFoundException] { Write-Host "成功捕获到命令不存在错误" } echo "Hello"
运行后你会看到捕获逻辑执行完成后,依然会正常打印Hello。
如果你不想让try捕获这类语句终止错误,也可以给命令显式指定ErrorAction参数:
try { nonexistingcommand -ErrorAction Continue } catch [System.Management.Automation.CommandNotFoundException] { Write-Host "这段捕获逻辑不会被触发" } echo "Hello"
这个代码的执行效果和你第一个脚本完全一致。
内容的提问来源于stack exchange,提问作者YoavKlein
相关产品推荐
相关产品推荐

