2010-04-01 24 views
4

我發現我一直當我不需要使用try..except。對於最後幾天有人在我定義幾乎每一個功能,我想,也許一個壞practice.For示例中使用的問題感到困惑:除了定義函數時,我應該如何使用try ...?

class mongodb(object): 

    def getRecords(self,tname,conditions=''): 
     try: 
      col = eval("self.db.%s" %tname) 
      recs = col.find(condition) 
      return recs 
     except Exception,e: 
      #here make some error log with e.message 

我的想法是,例外情況可能會隨處引發,我必須使用try才能得到它們。 而我的問題是,在定義函數的時候到處使用它是一個好習慣嗎?如果沒有,它是否有任何原則?幫助將不勝感激!

問候

+5

相反的eval'( 「self.db.%的」 %TNAME)',你應該使用'GETATTR(self.db,TNAME)' – 2010-04-01 12:14:08

+0

@Aaron Digulla謝謝你的筆記。 – Young 2010-04-01 12:22:49

+0

感謝您的質量答案,而難以選擇最好的一個〜 – Young 2010-04-02 02:38:37

回答

5

這未必是最好的事情。整體例外是,你可以在不同的級別上捕捉它們。最好在有足夠信息的地方處理它們,使它們有用(與應用程序和上下文相關)。

對於下面的示例代碼可以拋出的IOError(「[錯誤2]沒有這樣的文件或目錄」):

def read_data(filename): 
    return open(filename).read() 

在該功能你沒有足夠的信息來用它做什麼,但在地方你實際使用此功能,在這種異常的情況下,你可能會決定嘗試不同的文件名或顯示錯誤給用戶,或別的東西:

try: 
    data = read_data('data-file.txt') 
except IOError: 
    data = read_data('another-data-file.txt') 
    # or 
    show_error_message("Data file was not found.") 
    # or something else 
5

這(捕獲所有可能的例外非常寬泛)確實被認爲是不好的做法。你會掩蓋異常的真正原因。

只捕獲「明確地命名爲」類型的異常(你期望發生可以/將正常處理)。讓其餘的(意想不到的)泡沫,因爲他們應該。

您可以通過覆蓋sys.excepthook記錄這些(未捕獲的)例外(全球):

import sys 
import traceback 
# ... 

def my_uncaught_exception_hook(exc_type, exc_value, exc_traceback): 
    msg_exc = "".join(\ 
       traceback.format_exception(exc_type, exc_value, exc_traceback)) 
    # ... log here... 

sys.excepthook = my_uncaught_exception_hook # our uncaught exception hook 
4

你必須找到幾個目標之間的平衡:

  1. 應用程序應該從儘可能多的錯誤中自行恢復。

  2. 的應用程序應報告的足夠細節都不可恢復的錯誤來解決這個問題的原因。

  3. 錯誤隨處發生,但你不希望所有的錯誤處理代碼來污染你的代碼。

  4. 應用程序不應該崩潰

爲了解決#3,你可以使用一個exception hook。所有未處理的異常都會導致當前事務中止。在最高級別捕捉它們,回滾事務(因此數據庫不會變得不一致),並將它們再次拋出或吞下(這樣應用程序不會崩潰)。你應該使用decorators for this。這解決了#4和#1。

#2的解決方案是經驗。您將隨時間學習解決問題所需的信息。困難的部分是在發生錯誤時仍然有信息。一種解決方案是在低級方法中添加調試日誌記錄調用。

另一種解決方案是每個線程的字典,您可以在其中存儲一些位,並在發生錯誤時將其轉儲。

1

另一種選擇是在try中包含大部分代碼:除了:(例如在Web應用程序中,一個特定的GUI頁面),然後使用sys.exc_info()打印出錯誤以及堆棧在那裏發生

import sys 
import traceback 
try: 
    #some buggy code  
    x = ?? 
except: 
    print sys.exc_info()[0] #prints the exception class 
    print sys.exc_info()[1] #prints the error message 
    print repr(traceback.format_tb(sys.exc_info()[2])) #prints the stack 
相關問題