You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Pester捕获抛出错误?测试未捕获异常问题咨询

排查Pester测试未捕获指定错误的问题

我之前也碰到过类似的坑,咱们一步步来捋清楚问题出在哪:

1. 先检查测试语法是否正确

这是最容易踩的低级错误:你是不是直接写了这样的测试?

My-FailingFunction | Should -Throw "Expected error message"

这种写法是错的!PowerShell会先执行My-FailingFunction,错误直接抛到控制台,Pester根本没机会捕获它。正确的写法必须把函数调用放在脚本块里:

{ My-FailingFunction } | Should -Throw "Expected error message"

如果你的另一个函数测试用了脚本块,而这个没用到,那肯定会出现一个捕获成功、一个失败的情况。

2. 确认函数抛出的是终止性错误

Pester的Should -Throw默认只捕获终止性错误,如果你的函数用的是Write-Error(默认是非终止错误),那测试肯定抓不到。对比一下两个函数的错误抛出方式:

  • 能被捕获的函数:用了throw(终止错误)
  • 不能被捕获的函数:用了Write-Error(非终止错误)

这种情况下,你可以要么修改函数用throw,要么在测试里强制把非终止错误转为终止错误:

{ My-Function -ErrorAction Stop } | Should -Throw "Expected error message"

3. 检查函数内部有没有吞掉错误

看看未被捕获错误的函数,是不是内部有try/catch块把错误吃掉了?比如:

function My-Function {
    try {
        throw "Oops, something went wrong"
    }
    catch {
        # 这里只记录了错误但没重新抛出
        Write-Verbose "Caught an error internally"
    }
}

这种情况下,错误在函数内部被吞了,根本不会抛到外部,Pester自然捕获不到。你需要在catch块里加上throw或者throw $_把错误重新抛出来。

4. 排查错误动作偏好设置的影响

如果函数内部或者测试脚本全局设置了$ErrorActionPreference = 'SilentlyContinue',会导致非终止错误被忽略,甚至影响终止错误的行为。检查一下函数里有没有修改这个变量,测试环境里有没有全局配置。

例子对比:正确vs错误场景

能被捕获的函数(正确写法)

function Working-Function {
    throw "This error will be caught"
}

Describe "Working-Function Tests" {
    It "Throws expected error" {
        { Working-Function } | Should -Throw "This error will be caught"
    }
}

不能被捕获的函数(修正后)

function Broken-Function {
    Write-Error "This is a non-terminating error"
}

Describe "Broken-Function Tests (Fixed)" {
    It "Catches error after forcing termination" {
        { Broken-Function -ErrorAction Stop } | Should -Throw "This is a non-terminating error"
    }
}

先按照上面的步骤排查,大概率能找到问题所在。如果还是不行,可以把两个函数的代码和对应的测试代码贴出来,咱们再进一步分析。

内容的提问来源于stack exchange,提问作者Keith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:00:36