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

Node.js assert.throws如何断言函数抛出含指定错误消息的异常

问题原因

assert/strict 模块的 assert.throws API 从 Node.js v14.9.0 版本开始调整了参数规则:第二个参数如果直接传入字符串类型值,会被固定识别为断言失败时输出的自定义提示信息,不再作为错误消息的匹配规则。当你传入的字符串和预期抛出的错误消息完全一致时,Node 会直接抛出参数歧义报错,就是你看到的提示内容。

你之前尝试的两种写法不生效的原因:

  • 直接传入 myFunction 函数引用作为第一个参数的写法,没有解决第二个参数是字符串的歧义问题,和最初的写法触发的是同一个报错。
  • 传入错误校验函数的写法逻辑本身是正确的,如果运行未通过,大概率是实际抛出的错误不符合你写的校验条件(比如错误类型不对、message 文本不匹配),不是写法语法问题。
正确写法(无需正则)

最简洁的实现方式是给第二个参数传入普通对象,assert/strict 会自动对捕获到的错误对象做部分深度匹配,精准校验你指定的属性,完全不需要写正则或者自定义校验函数:

import assert from 'node:assert/strict';

// 仅精确匹配错误消息
assert.throws(
  () => myFunction(),
  {
    message: 'content of error.message goes here'
  }
);

// 如果需要同时校验错误类型是自定义错误,可使用校验函数写法
assert.throws(
  () => myFunction(),
  (err) => {
    assert.ok(err instanceof CustomError);
    assert.strictEqual(err.message, 'content of error.message goes here');
    return true;
  }
);

如果你需要给断言加自定义失败提示,把提示字符串放在第三个参数位置即可:

assert.throws(
  () => myFunction(),
  { message: 'content of error.message goes here' },
  'myFunction 未抛出符合预期的自定义错误'
);

注意:永远不要把要匹配的错误消息直接作为第二个参数传入,这个旧版API用法在当前Node版本下已经被废弃,必然触发歧义报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:48:22