我是否應該總是將外部資源調用包裝在try-catch中? (即調用數據庫或文件系統)調用外部資源時是否有錯誤處理的最佳做法?總是嘗試捕獲外部資源調用?
回答
捕捉唯一的例外你可以處理。因此,例如,在使用外部資源時,最佳做法是捕獲您知道可以處理的異常的特定。在文件的情況下,這可以是(IOException,SecurityException等),在數據庫的情況下,異常可以是SqlException或其他。
在任何情況下,不抓例外,你不處理,讓它們流向上層能。或者,如果出於某種原因,你確實發現了異常但不處理它們,只需使用拋出;(這將創建一個rethrow IL op,而不是trow)。
如果使用的資源不知道哪種類型的異常可能拋出,那麼您有必要捕獲一般的異常類型。在這種情況下,保險櫃的事情將是使用來自不同應用程序域的所述資源(如果可能的話),或者讓異常冒泡到頂層(例如UI),在那裏它們可以被顯示或記錄。
我認爲絕對答案是完全有條件的(如何控制環境,性能和一致性之間的預期平衡以及其他許多其他我確信),但總體而言,我總是這樣做,選擇安全超過潛在的較慢性能。
它總是取決於你想達到的目標。沒有響應的服務器可能會嚴重到足以阻止例程執行什麼操作,並且異常應該拋出給調用者。
在其他情況下,你不關心你是否無法更新數據庫。然後消耗例外是好的。
顯然,您不想向最終用戶顯示堆棧跟蹤,所以您需要在某處捕獲它。
Eric Lippert在此有一個很好的博客,here。
除非你能做一些有用的事情,否則沒有意義(除了「煩人的」(見博客))捕捉異常。而且在大多數情況下,你根本無法 - 所以讓它冒泡(你的UI顯然應該清理並顯示一些東西)。
但是,您可能有一個「嘗試/最終」來處理資源管理。甚至更乾淨,「使用」塊做同樣的事情。
我認爲有三個方面的原因有一個catch塊:
- 您可以處理異常和恢復(從「低水平」的代碼)
- 你想重新包裝異常(再次,從「低水平」的代碼)
- 你在堆棧的頂部,而你不能恢復操作本身,你不希望整個應用程序如果你堅持下去
對於這些,你應該有非常fe w catch塊與try/finally
塊相比 - 而那些try/finally
塊幾乎總是隻叫Dispose
,因此最好寫成using
聲明。
底線:有一個finally
塊來釋放資源是非常重要的,但catch
塊應該通常很少見。
- 1. 資源是外部
- 2. 使用嘗試用資源
- 3. 應嘗試使用資源
- 4. C#使用繼續嘗試捕獲的內部捕獲
- 5. 例外情況未被'嘗試'捕獲
- 6. Ocaml例外與嘗試捕獲
- 7. 嘗試從資源庫Url獲取UIImage
- 8. 嘗試資源不在嘗試塊
- 9. 嘗試使用RAII捕獲?
- 10. WebResponse嘗試捕獲
- 11. MySql嘗試捕獲
- 12. Powershell嘗試將寫入錯誤捕獲到外部txt文件
- 13. 運行從外部嵌套捕獲嘗試
- 14. 編程風格:嘗試捕獲和外部依賴
- 15. 嘗試捕獲異常總是返回空
- 16. 在資源嘗試中不工作,但嘗試不使用資源
- 17. 單元測試和外部資源
- 18. Cmake外部資源
- 19. Aurelia外部資源
- 20. php嘗試捕獲不捕獲異常
- 21. Pdo錯誤捕獲嘗試/捕獲
- 22. 使用與「嘗試用資源」
- 23. 嘗試和捕捉,總是捕捉異常
- 24. 調試需要訪問外部資源(同源策略)的GWT應用程序
- 25. 的IntelliJ無法獲取外部資源
- 26. 自動從外部源獲取資產
- 27. 如何從AnyLogic 7的外部資源獲取資源流量?
- 28. Applescript指示嘗試在應用程序內部調用時找不到資源
- 29. 嘗試使用資源如何調用刷新方法
- 30. 嘗試在Clojure中使用資源