Node.js中如何使用assert模块设置errorType标志
给Node.js Assert错误添加自定义
errorType属性 嘿,我来帮你搞定这个问题!你现在用if/else的方式虽然能实现,但其实Node.js的assert模块提供了更直接的方法来给错误添加自定义errorType属性,不用绕弯子。
方法1:用assert.fail()手动抛出带自定义属性的AssertionError
你可以先创建一个assert.AssertionError实例,给它加上errorType属性,然后用assert.fail()抛出这个错误。这样既保留了标准断言错误的特性,又能添加自定义字段:
var assert = require('assert'); var l = [1, 2, 3]; var x = 3; // 检查x是否在黑名单中 if (l.indexOf(x) !== -1) { // 创建断言错误实例 const assertionErr = new assert.AssertionError({ message: "you are in list blacklisted numbers", actual: x, // 可选:记录实际值 expected: "value not in blacklist", // 可选:记录预期值 operator: "not includes" // 可选:记录断言操作符 }); // 添加自定义errorType属性 assertionErr.errorType = 1; // 抛出这个错误 assert.fail(assertionErr); }
当x为3时,抛出的错误会包含errorType: 1,同时保留AssertionError的原生属性(比如name、stack等)。
方法2:自定义继承AssertionError的错误类
如果需要频繁使用带errorType的断言错误,可以创建一个自定义错误类,继承自assert.AssertionError,这样每次抛出时直接实例化这个类即可:
var assert = require('assert'); // 自定义断言错误类 class BlacklistAssertError extends assert.AssertionError { constructor(options) { // 调用父类构造函数 super({ message: options.message, actual: options.actual, expected: options.expected }); // 添加自定义属性 this.errorType = options.errorType; // 自定义错误名称(可选) this.name = 'BlacklistAssertError'; } } var l = [1, 2, 3]; var x = 3; if (l.indexOf(x) !== -1) { throw new BlacklistAssertError({ message: "you are in list blacklisted numbers", actual: x, errorType: 1 }); }
这种方式更适合重复场景,代码更整洁,错误类型也更清晰。
为什么你原来的方式不够优雅?
你之前用if (!(l.indexOf(x) < 0)) { var errorType = 1; assert(false, "...") }的写法,其实没法把errorType绑定到抛出的错误上——因为assert(false, message)会自动创建一个新的AssertionError实例,你没法直接修改它的属性。上面两种方法都是先拿到错误实例,添加属性后再抛出,完美解决这个问题。
内容的提问来源于stack exchange,提问作者Alok
相关产品推荐
相关产品推荐

