【问题标题】:Getting unhandled exception from a reject within a promise while debugging in VS Code在 VS Code 中调试时从 promise 中的拒绝中获取未处理的异常
【发布时间】:2017-09-02 01:08:20
【问题描述】:

在 VS Code 中调试时,我从承诺中的 reject(new SomeKindOfError()) 收到未处理的异常错误是否正常,但不是在我不调试时?还是我的代码结构有问题?

根据我从几个关于 Promise 和 stackoverflow 答案的教程中学到的知识,在 Promise 链的最后一个 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
        }
    })
})

附:我已经尝试过在遇到未处理的异常时不执行 break 的调试,但这有点违背使用调试器的目的:检查可能发生的未处理的异常。

编辑:

另外,我尝试在没有捕获的情况下调用returnAPromise(),并且在调试器控制台中打印了一条警告说rejected promise not handled within 1 second

【问题讨论】:

  • Nvm 关于我的回答如下。我明白你现在的意思了。我以为你在问为什么它总是在 catch 块中。
  • 您真的在那里收到“未经处理的拒绝”吗? Afaik 你可以让你的调试器在每一个被创建的Error 上隐式中断,不管它是否会在以后被捕获。
  • 嗨@Bergi,我在帖子中添加了一个屏幕截图。似乎我并没有真正收到未经处理的拒绝,因为我没有收到警告(就像我在编辑中描述的那样),但调试器仍然在那里中断。
  • 是的,看起来很像它在错误构造函数上中断。
  • 您有什么建议可以抑制这种行为吗?

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


【解决方案1】:

感谢@Bergi 指出这是因为 Error 构造函数。我没有注意到... :'(

事实证明,问题不是因为承诺没有抓住它。这是因为在扩展内置 Typescript 类时出错。

这是我找到的stackoverflow post,它指的是这个 Typescript documentation 关于 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)
    }
}

【讨论】:

    猜你喜欢
    • 2017-12-30
    • 2018-03-19
    • 2017-11-20
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多