是的,沒有......好的,也許我們需要詳細說明。
如果我們談論「生產質量代碼」,即代碼如果不起作用就會花費大量資金,但我們不能假設基礎架構(運行時,庫等)正常工作。因爲他們沒有。庫有錯誤,即使它們不影響我們,它們依賴於有限的資源,如內存,文件句柄以及併發的東西:線程。
因此,在某個時刻應該意識到的一件事是:即使是最微不足道的代碼行也可能會失敗。所以這是肯定的部分:是的,你應該關注這種可能性。
旁邊的任何部分:你寫
應退還
錯誤,而不是拋出,例如使用或者是scalactic或
對於您所期望的異常,這是正確的。事情很可能會失敗。在100000次以上的處決中,多說1次。 (是的,我把這個數字從我的帽子裏拿出來,我甚至沒有穿過)。在這種情況下,添加明確的異常處理是適當的,您提到的建議也適用。
但它不適用於所有其他可能的故障模式。如果你試圖用這種方法來處理它們,你將無法在所有異常處理之間找到你的主代碼。而且您可能會在此過程中添加大量的錯誤。
相反,有一些通用的策略來處理代碼中的任意異常。對於這些情況,異常是使用正確的工具。對於這個策略,簡單更好,因爲你真的不知道這個代碼會在什麼情況下執行。
Web應用程序中的典型方法是圍繞完整的請求嘗試一個catch塊,記錄異常並返回一些錯誤頁面。
更復雜的方法是像Akka這樣的Actor框架,它有Actor來完成工作。如果這樣的Actor引發異常,Actor將會死亡並被新的替換(用各種方式來控制確切的行爲)。
另一種方法,即獲取與上述兩種方法結合起來,是有不同的機器上應用程序的多個實例運行,所以一臺機器上的問題不會影響別人。
正如你所看到的方法來處理您的基礎架構中的例外,包括但不限於執行你的期貨庫是用於處理您的期貨的「正常」的失效模式的異常處理非常不同。
我猶豫狡辯,但我沒有看到PromiseCompletingRunnable如何防止ExecutionContext(廣義上)將結果設置爲任何想要的。另一方面,考慮到其他答案和其他答案,我會感覺到我不需要太在意 - 只要我不寫自動駕駛儀或其他東西。 –
@EdStaub PromiseCompletingRunnable中的'promise'是一個val,你不能嘗試多次完成'Promise'。所以一旦'run()'開始執行,執行者確實沒有辦法改變它的值。你可能會說執行者可能會先嚐試完成'Promise',但我不知道任何執行者甚至知道'Promise'甚至* *是什麼。所以從理論上講,一些自定義執行程序可以在執行前執行此操作,但實際上沒有。標準庫中的默認行爲不會這樣做,也不應該這樣做。 –
謝謝。 FWIW,我主要關心run()根本無法執行的情況,並且執行程序可能會通過填寫自己的失敗來指示它。 –