2011-01-13 38 views
5

你什麼時候使用每個?我發現我使用if比例外更多。我似乎在使用我的「ifs」來捕捉例外之前,我甚至沒有得到它們。有我的代碼全是ifs。什麼時候應該使用「if」檢查錯誤,以及何時應該使用異常?

+1

這已被問無數次(2739582,1152541,1313812)。在這個問題之間,你的問題4557577(毫無疑問,無數其他人)和你現在超過800個問題*,似乎你是垃圾郵件發送者的問題。 – 2011-01-13 07:01:35

回答

2

嘗試catch語句旨在處理嚴重錯誤,尤其是連接到外部服務(如Web服務,數據庫,Web請求等),其中錯誤將會隨時發生。在運行時環境中處理異常比在編寫好的代碼和使用給定語言的特性(如ifs或三元操作)上要重要得多。

嘗試捕獲不是第一道防線,它們是使用防禦性編碼實踐的最後一條線。

1

尤其是當您使用大型應用程序時,異常處理確實是一種更好的做法。正如你所提到的,你會得到很多if語句。使用python,使用try/except語句可以讓你創建一個處理異常的更加標準化的方法。有了例外情況,您將看到異常類的類型以及您構建的其他自定義類的好處。它只是給你一個更加結構化的編碼方式。

4

EAFP: Easier to ask for forgiveness than permission.

這是常見的Python代碼風格的假設有效密鑰或屬性和捕獲異常的存在,如果假設證明錯誤的。

與此相反,LBYL (Look before you leap)風格常見於許多其他語言如C

更新1

當然,你必須確保你處理任何捕獲的異常,而不是隻是默默地忽略它們否則你會浪費很多時間調試! pass可能不是你正在尋找的!

更新2

你應該抓住特定的例外,你是期待raise -d,無論是built-in exceptions或其他方式。

+0

我把泛型嘗試:除了例外,:print e pass是那個? – TIMEX 2011-01-13 06:14:57

2

我不重複了許多人已經說過,但有使用異常的一個很大的優勢,我想提一提其中:

如果一些常規失敗,你可以輕鬆的哪個級別決定間接,你應該處理這個異常 - 你不需要在每一步之後用錯誤檢查來膨脹更深的層次。

當然,這並不能讓您擺脫責任,即擁有良好的清理代碼,這將使每一個可能的執行路徑都變得清晰:因此釋放所有資源,套接字,提交或回滾事務等。而且有很多辦法來做到這一點:

  • try... finally塊,允許任何異常傳播,但清洗前的一切行動(多國語言,包括Python),
  • with聲明(具體到Python),
  • 涉及在析構函數中清理(主要是C++)的RAII範例。
相關問題