Javascript 在VS代码中调试时从承诺内的拒绝中获取未处理的异常
在VS代码中调试时,我从承诺内的Javascript 在VS代码中调试时从承诺内的拒绝中获取未处理的异常,javascript,debugging,typescript,promise,visual-studio-code,Javascript,Debugging,Typescript,Promise,Visual Studio Code,在VS代码中调试时,我从承诺内的拒绝(new SomeKindOfError())中得到未处理的异常错误,但在我不调试时,这是否正常?还是我的代码结构有问题 从几篇关于承诺和stackoverflow答案的教程中,我了解到,承诺链末尾的Promise#catch()足以捕捉到承诺链中可能发生的拒绝。但为什么调试器仍将其标记为未处理的异常 以下是我使用的结构: function returnAPromise(): Promise<any> { return new Promis
拒绝(new SomeKindOfError())
中得到未处理的异常错误,但在我不调试时,这是否正常?还是我的代码结构有问题
从几篇关于承诺和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
}
})
})
函数returnAPromise():Promise
此外,我尝试调用returnAPromise()
,但没有捕获,并且调试器控制台中会打印一条警告,说拒绝承诺在1秒内未处理
感谢@Bergi指出这是由于错误构造函数造成的。我没有注意到……:'(
事实证明,问题不是因为承诺没有捕捉到它,而是因为扩展内置类型脚本类时出错
这是我发现的一个,它引用了这个关于在v2.1中破坏更改的类型脚本
扩展诸如Error、Array和Map之类的内置函数可能不再有效。作为用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)
}
}
感谢@Bergi指出这是由于错误构造函数造成的。我没有注意到…:'(
事实证明,问题不是因为承诺没有捕捉到它,而是因为扩展内置类型脚本类时出错
这是我发现的一个,它引用了这个关于在v2.1中破坏更改的类型脚本
扩展诸如Error、Array和Map之类的内置函数可能不再有效。作为用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)
}
}
Nvm关于我下面的回答。我现在明白你的意思了。我还以为你在问为什么总是被挡在陷阱里。你真的被“未经处理的拒绝”了吗有吗?好吧,你可以让你的调试器在每次创建错误时隐式中断,不管以后是否会被捕获。嗨@Bergi,我在我的帖子中添加了一个屏幕截图。看来我并没有收到未经处理的拒绝,因为我没有收到警告(就像我在编辑中描述的那样),但调试器仍然在那里中断。是的,看起来很像它在错误构造函数上中断。您有什么建议可以抑制这种行为吗?Nvm关于我下面的回答。我现在明白您的意思了。我以为您在问为什么它总是在catch block中。您真的收到了“未经处理的拒绝”吗有吗?好吧,你可以让你的调试器在每次创建错误时隐式中断,不管以后是否会被捕获。嗨@Bergi,我在我的帖子中添加了一个屏幕截图。看来我并没有收到未经处理的拒绝,因为我没有收到警告(就像我在编辑中描述的那样),但调试器仍在那里中断。是的,看起来很像它在错误构造函数上中断。您有什么建议来抑制该行为吗?