我是Angular2的新手,並且負責開發「健壯的錯誤處理」。到目前爲止,我已經遵循了簡單的例子(console.logging)來添加自定義錯誤處理。但有時候,如果頁面由於錯誤而完全停止加載,我們將要重定向用戶。哪些類型的Javascript(Angular2)錯誤會阻止頁面完成渲染
但有時,如下所示,儘管存在錯誤,但頁面完全加載。是否只有某些類型的錯誤會阻止頁面完全加載? One of the following 6 types perhaps?
我是Angular2的新手,並且負責開發「健壯的錯誤處理」。到目前爲止,我已經遵循了簡單的例子(console.logging)來添加自定義錯誤處理。但有時候,如果頁面由於錯誤而完全停止加載,我們將要重定向用戶。哪些類型的Javascript(Angular2)錯誤會阻止頁面完成渲染
但有時,如下所示,儘管存在錯誤,但頁面完全加載。是否只有某些類型的錯誤會阻止頁面完全加載? One of the following 6 types perhaps?
任何錯誤可以停止渲染你的頁面,取決於它在你的過程中出現。如果它處於回調或其他異步操作中,則可能無法捕獲任何錯誤。
小心像「穩健的錯誤處理」方面 - 我見過的要求僅僅是巨大的商業項目,但實際上只是默默的卡車超過負荷的問題,有點像on error resume next
。
我發現黃金法則是:
如果您的應用程序可以通過一個例外繼續(如從非基本服務獲取腐敗JSON數據),那麼特定情況下應始終明確的處理。
否則意外的異常應該總是會破壞某些可見的東西。
第二條規則是違反直覺的,但它確實是最佳實踐。用戶會抱怨他們看到的錯誤,而可見的異常和崩潰會使他們失望,並降低他們對應用程序的信心。
但是,他們沒有看到的例外仍然發生,並且因爲您已經無聲無息地通過它們卡車,無論造成它們是什麼仍然存在。無聲的異常會導致數據丟失或損壞。它們會導致你在生產6個月後才發現的錯誤。它們會導致你可以被起訴的那種錯誤。
用戶會原諒你明顯的錯誤,你快速修復,他們會離開,如果你失去了數據,並不立即知道它,永遠不會回來。
好了,所有的說,你似乎是突出的錯誤是異步,並涉及有時被描述爲回調地獄問題。
在您的屏幕截圖中,錯誤來自HTTP GET請求 - 這通常是您發出AJAX請求的方法,成功時觸發回調,但沒有回調來處理異常。
Angular2使用承諾,這是您的屏幕截圖的下一個錯誤行。承諾包裹這些回調,並允許你鏈接 - 他們真的幫助回調地獄,但他們不是一個神奇的子彈:你必須確保每個.then()
有一個錯誤處理程序或以下.catch()
。
但是,還有一種更好的方法:使用Angular2你可以使用TypeScript,這意味着你可以使用async
和await
。這些是承諾的語法糖,但它們也可以與try
-catch
一起使異步異常的錯誤處理更容易。我的blogged about that in a lot more detail than I can fit here。
TL; DR:在Angular2使用async
/await
(與TS transpilation如果你需要的話),以確保您的Promise
和回調例外賺回來了,然後處理你所期望的/可變通解決和明顯的崩潰爲你不能。