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
相关产品推荐
相关产品推荐

