这些天我经常使用async / await,但是我进行了一项mocha测试,在其中进行测试以确保确实抛出了错误。在下面,您可以看到try / catch块,我必须捕获此错误。绿色和灰色方块是由Wallaby(一种实时测试工具)插入的,表示从未到达捕获块。
当我从命令行运行mocha时,会收到以下消息:
UnhandledPromiseRejectionWarning:FireModel :: WrongRelationshipType:无法在带有fancyperson的addToRelationship()上使用属性“ employer”,因为它不是hasMany关系[relType:ownedBy,inverse:undefined]。如果您使用的是ownedBy关系,则应改用setRelationship()和clearRelationship()。
addToRelationship()
的第一行检查关系类型是否正确(不是)并抛出错误:
_errorIfNotHasManyReln
方法并不令人兴奋,但是为了完整起见,这里是:
protected _errorIfNotHasManyReln(
property: Extract<keyof T, string>,
fn: string
) {
if (this.META.property(property).relType !== "hasMany") {
const e = new Error(
`Can not use property "${property}" on ${
this.modelName
} with ${fn}() because it is not a hasMany relationship [ relType: ${
this.META.property(property).relType
}, inverse: ${
this.META.property(property).inverse
} ]. If you are working with a ownedBy relationship then you should instead use setRelationship() and clearRelationship().`
);
e.name = "FireModel::WrongRelationshipType";
throw e;
}
有人可以帮助我确定为什么未捕获此错误的原因吗?无奈之下,我在调用_errorIfNotHasManyreln
的调用周围添加了另一个try / catch块,它确实捕获了错误,但是随后我尝试重新抛出它并再次遇到相同的情况。
答案 0 :(得分:2)
您的addToRelationship方法也是异步的。您还必须await
做出承诺响应:
try {
await bob.addToRelationship("employer", "4567");
}
catch(e) {
[...]
}
如果没有延迟到承诺拒绝,那么try / catch不会收到任何已同步并终止的内容。然后发生异常,显然没有捕获到该异常。