在VS代码中进行调试时,从承诺中的拒绝中获取未处理的异常

时间:2017-04-06 19:58:38

标签: javascript debugging typescript promise visual-studio-code

在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。遇到未处理的异常时,我已经尝试了调试而不执行中断,但它有点违背了使用调试器的目的:检查可能发生的未处理异常。

编辑:

Unhandled exception error from a reject

此外,我尝试在没有捕获的情况下调用returnAPromise(),并在调试器控制台中输出警告rejected promise not handled within 1 second

1 个答案:

答案 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)
    }
}