簡體   English   中英

AngularJS中的promise會捕獲每個異常/錯誤嗎?

[英]Do promises in AngularJS catch every exception/error?

我在工作中繼承了一個包含以下模式的十幾個示例的代碼庫:

var promise = null;
try {
    promise = backendService.getResults(input);
}
catch (exception) {
    console.err(exception);
}
if (promise !== null) {
    promise.then(function (response) {
        // do stuff
    })
    .catch(function (error) {
        console.err(error);
    });
}

其中backendService是一個Angular服務,后者又通過$http調用REST服務。

所以這是我的問題:try / catch真的有必要嗎? 是否會出現一個特定錯誤/異常的情況,即promise的.catch無法捕獲?

這已經有點對球隊辯論的整個上午的主題,我們已經拿出了唯一的解決辦法是,我們不認為這是必要的,但(一)改變它打破寫沿着它的測試(這也需要改變),(b)嗯......這是防御性編碼,對吧? 這不是一件壞事。

然而,當有更重要的事情要做的時候,實際上有必要將它重構為遺忘的優點並不是我所要求的。 我只是想知道這是一個合理的模式,當承諾被傳遞這樣(特別是在AngularJS,如果這有所不同),或只是偏執狂。

AngularJS中的promise會捕獲每個異常/錯誤嗎?

序號只有從里面拋出的異常then / catch 回調會被自動捕獲。 發生在它們之外的所有錯誤都需要明確處理。

是否會出現一個特定錯誤/異常的情況,即promise的.catch無法捕獲?

是。 backendService.getResults(input)調用可能不會返回 promise,但它可能會拋出異常。 或者,當backendService為null時,它甚至沒有那么遠,你將得到一個ReferenceError.getResults不是一個函數,你會得到一個TypeError

是try / catch真的有必要嗎?

並不是的。 在后一種情況下,你的代碼有一個嚴重的錯誤,你可能不關心拋出和崩潰。 前一種情況,即backendService.getResults(input)拋出,被嚴重鄙視。 異步函數永遠不應該throw但只返回promise - 正是因為你不必編寫兩個錯誤處理語句。

嗯......這是防御性的編碼,對嗎? 這不是一件壞事。

是的,差不多。 但這里有疑問。 這里的同步異常實際上意外的 ,而不僅僅是可以處理其故障的服務。 catch塊中的日志消息應表示這一點。

請注意,它也不夠防御。 它沒有捕獲getResults()確實返回的可能更可能的錯誤,而是一些不是promise的錯誤。 在那上面調用.then()可能會拋出。 類似地, if (promise !== null)是可疑的,因為它在錯誤地返回null時隱藏(我們真的需要try-catch-else )。

是try / catch真的有必要嗎?

並不是的。 只要你的backendService.getResults()返回一個promise。 喜歡return $http(...)

是否會出現一個特定錯誤/異常的情況,即promise的.catch無法捕獲?

我不這么認為,因為任何錯誤將被拒絕承諾,它將落入你的.catch()處理程序

嗯......這是防御性的編碼,對嗎? 這不是一件壞事。

這取決於... Javascript try / catch有一些性能問題。 因此,如果你只是為了確保使用,你可以刪除它:)

如果您願意, 在此處進一步了解try-catch討論: Javascript Try-Catch Performance Vs. 檢查代碼時出錯

暫無
暫無

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

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