Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在VS代码中调试时从承诺内的拒绝中获取未处理的异常_Javascript_Debugging_Typescript_Promise_Visual Studio Code - Fatal编程技术网

Javascript 在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

在VS代码中调试时,我从承诺内的
拒绝(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,我在我的帖子中添加了一个屏幕截图。看来我并没有收到未经处理的拒绝,因为我没有收到警告(就像我在编辑中描述的那样),但调试器仍在那里中断。是的,看起来很像它在错误构造函数上中断。您有什么建议来抑制该行为吗?