在VS代码中调试时,我从promise中的reject(new SomeKindOfError())
获取未处理的异常错误是否正常,但是当我没有调试时却没有?或者我的代码结构有什么问题吗?
根据我从几个关于promises和stackoverflow答案的教程中学到的知识,在承诺链的末尾Promise#catch()
足以捕获链中可能发生的拒绝。但是为什么它仍然被调试器标记为未处理的异常?
这是我使用的结构:
function returnAPromise(): Promise<any> {
return new Promise<any>((resolve, reject) => {
// do something here
if (isConditionMet) {
resolve()
} else {
reject(new SomeKindOfError()) // debugger breaks here
}
})
}
someElement.onSomeEvent(() => {
// only care about the errors that might occur
returnAPromise().catch((error) => {
if (error instanceof SomeKindOfError) {
// perform necessary actions when this error occurred
}
})
})
P.S。遇到未处理的异常时,我已经尝试了调试而不执行中断,但它有点违背了使用调试器的目的:检查可能发生的未处理异常。
编辑:
此外,我尝试在没有捕获的情况下调用returnAPromise()
,并在调试器控制台中输出警告rejected promise not handled within 1 second
。
答案 0 :(得分:0)
感谢@Bergi指出它是因为Error构造函数。我没注意到......:&#39;(
事实证明,问题不在于承诺没有抓住它。这是因为扩展内置的Typescript类时出错。这里是我发现的stackoverflow post,它引用了这个打字稿documentation关于打破v2.1中的更改。
扩展错误,数组和地图等内置函数可能不再有效。作为使用super(...)调用返回的值替换this的值的一部分,子类化Error,Array和其他可能不再按预期工作。这是因为Error,Array等的构造函数使用ECMAScript 6的new.target来调整原型链;但是,在ECMAScript 5中调用构造函数时,无法确保new.target的值。其他下层编译器默认情况下通常具有相同的限制。
因此,我必须在扩展Error类的类的构造函数中添加一行代码。
class SomeKindOfError extends Error {
constructor(m: string) {
super(m)
// I have to add this additional line of code
Object.setPrototypeOf(this, SomeKindOfError.prototype)
}
}