![](/img/trans.png)
[英]Why does VS Code break on handled exception from Reject in 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.