2011-11-29 77 views
4

我正在製作一個GUI,我發現自己正在使用很多tryexcept陳述。我的問題是,我應該重新設計我的程序,以便使用更少的tryexcept語句或者是tryexcept是一個在python程序中使用的良好實踐嗎?我喜歡它們是因爲它們具有豐富的信息,並且使我更容易進行調試。只是想知道真正的開發者是怎麼想的。嘗試除編程禮儀

感謝

+0

你能更具體嗎? 「良好做法」是什麼意思?如果您需要捕獲異常,則需要捕獲異常。有什麼選擇? – jterrace

+0

如果它能幫助你更好地理解你自己的程序,並讓你的生活更輕鬆,那就去做吧。你不是要在地球上編寫最好的代碼,對吧? – hochl

+0

@jterrace:這實際上與Python的工作原理有關,比你想象的更多。 [EAFP](http://docs.python.org/glossary.html#term-eafp)是常用的方法,但我相信它也可能被破壞。 _Diaper反模式是其中一個例子。 – Tadeck

回答

4

決定是否捕獲異常的一個重要考慮因素是您可能隱藏的合法錯誤。

例如,考慮下面的代碼:

try: 
    name = person['name'] 
except KeyError: 
    name = '<none provided>' 

這是合理的,如果person被稱爲是一個dict ...但如果person都不可能更復雜的東西,例如:

class Person(object): 
    def __getitem__(self, key): 
     return do_something(key) 

您冒着意外捕獲由合法錯誤導致的異常(例如do_something中的錯誤)的風險。

我覺得有必要提一下:你應該never, ever (except under a couple of very specific circumstances) use a "naked" except:

我個人的偏好是儘可能避免捕捉異常(例如,使用name = person.get('name', '<none provided>')),這兩者都是因爲我覺得它更乾淨,而且我不喜歡try/catch塊的外觀。

+0

+1一個很好的寫法。 – ChristopheD

+0

+1我絕對同意使用'get(name,default)'而不是'try' /'except'替代方法 –

2

很難對是否應該使用更少的異常處理給出一個普遍的答案......你絕對可以做太多太少。捕捉每個可能的異常幾乎肯定是錯誤的,而且幾乎可以肯定是不會做異常處理的錯誤。

這裏有一些事情要考慮:

  • 它通常是捕獲異常,如果你可以以編程方式做一些錯誤情況是個好主意。例如。你的代碼試圖發出一個web請求,如果失敗了,你想重試。在這種情況下,你想捕捉異常,然後重試。
  • 仔細想想哪裏有來捕捉異常。在一些低級函數中,你能合理地對錯誤做些什麼嗎?例如。假設你有一個寫出文件的函數,並且失敗時會出現權限錯誤。在那裏可能沒有太多可以做的,但也許在更高層次上,你可以捕捉異常並向用戶顯示一條消息,指示他們嘗試將文件保存在其他地方。
  • 捕捉「致命」類型的錯誤幾乎沒有意義,例如內存不足,堆棧溢出等等。至少在你的代碼中不低 - 它可能是有意義的,有一個頂級處理程序試圖正常退出。
  • 不要「吞下」真正應該冒泡的例外,即如果您的調用函數應該真正看到它,則不會有不會重新拋出異常的except子句。這可以隱藏嚴重的錯誤。

要了解更多信息,請執行Google搜索「異常處理指南」。您看到的許多結果將用於其他語言/環境,但這些概念也適用。