簡體   English   中英

在VS Code中調試時,從promise中的拒絕獲取未處理的異常

[英]Getting unhandled exception from a reject within a promise while debugging in VS Code

在VS代碼中進行調試時,我從reject(new SomeKindOfError())reject(new SomeKindOfError())獲取未處理的異常錯誤是正常的,但是當我沒有調試時卻沒有? 或者我的代碼結構有什么問題嗎?

根據我從有關promises和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
        }
    })
})

PS我在遇到未處理的異常時已經嘗試了調試而沒有執行中斷,但它有點違背了使用調試器的目的:檢查可能發生的未處理異常。

編輯:

拒絕的未處理異常錯誤

此外,我嘗試在沒有catch的情況下調用returnAPromise() ,並且在調試器控制台中輸出一個警告,說明rejected promise not handled within 1 second

感謝@Bergi指出這是因為Error構造函數。 我沒注意到......:'(

事實證明,問題不是因為承諾沒有抓住它。 這是因為擴展內置的Typescript類時出錯。

這是我發現的一個stackoverflow帖子 ,它引用了這個關於在v2.1中打破變化的Typescript 文檔

擴展錯誤,數組和映射等內置函數可能不再有效。 作為使用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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM