我使用sequelize@4.8.0和expressJS。
我理解如何捕捉特定类型的续集错误并且效果很好。
return db.mySequel.transaction(t => {
return db.users.findOrCreate({
...,
transaction: t
}).spread((rs, created) => {
if (created == false) throw new Error("00001");
return db.misc.bulkCreate([
{
...
},
{
...
}
], {
transaction: t,
raw: true
});
})
}).then(rs => {
res.json(rs);
}).catch(db.mySequel.ForeignKeyConstraintError, err => {
...
}).catch(err => {
...
});
但是这个查询事务进程也会抛出自定义错误实例。所以我想从我的错误中分别捕获所有类型的Sequelize Error。
也许我可以制造更多的捕获链,看起来很冗长。
我尝试了.catch(db.mySequel.BaseError
但没那么有用。
答案 0 :(得分:3)
使用单个catch块而不是使用多个catch块,然后测试对象的instanceof
以确定如何处理异常。
.catch(err => {
if (err instanceof db.mySequel.ForeignKeyConstraintError) {
// handle foreign key constraint
} else {
// handle other error
}
});
答案 1 :(得分:0)
我在文档提到的Error类中找到了继承关系。
我可以抓住与Object.getInstanceOf()
方法的关系。 __proto__
属性也有意义,但我更喜欢更严格的规则。 (尽管__proto__采用了javascript引擎的大部分内容。它只是事实上的标准。)
这就是我的方式:
var names = [];
(function p (inst) {
if (inst != null) {
var ofProto = Object.getPrototypeOf(inst);
names.push(ofProto.constructor.name);
p(ofProto);
}
})(err);
console.log(names)
// ["ForeignKeyConstraintError", "DatabaseError", "BaseError", "Error", "Object"]
现在可以找出错误的来源。