[英]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.