2010-03-04 51 views
3

我需要確定誰提出異常來處理更好的str錯誤,有沒有辦法?如何確定哪些函數調用在Python中引發異常?

看看我的例子:

try: 
    os.mkdir('/valid_created_dir') 
    os.listdir('/invalid_path') 
except OSError, msg: 

    # here i want i way to identify who raise the exception 
    if is_mkdir_who_raise_an_exception: 
     do some things 

    if is_listdir_who_raise_an_exception: 
     do other things .. 

我怎麼能解決這個問題,在Python?

回答

8

如果你有完全獨立的任務,視其功能失敗了,因爲你的代碼似乎表明,再分出嘗試/ EXEC塊,因爲現有的答案,建議執行,可能會更好(儘管如果第一部分失敗,您可能需要跳過第二部分)。

如果您在這兩種情況下都需要做很多事情,並且只有少量工作取決於哪個功能失敗,那麼分離可能會產生大量重複和重複,因此您建議的形式很可能是優選的。該traceback模塊Python的標準庫可以在這種情況下幫助:

import os, sys, traceback 

try: 
    os.mkdir('/valid_created_dir') 
    os.listdir('/invalid_path') 
except OSError, msg: 
    tb = sys.exc_info()[-1] 
    stk = traceback.extract_tb(tb, 1) 
    fname = stk[0][2] 
    print 'The failing function was', fname 

當然代替print您將使用if檢查,以確定到底是什麼處理的事情。

+0

+1但不是stk [0] [3]返回失敗的函數嗎? – luc 2010-03-04 15:06:20

+0

@luc,這將是來源,但只有在可用時;在http://docs.python.org/library/traceback.html?highlight=traceback#traceback.extract_tb中引用文檔,「」「預處理的」堆棧跟蹤條目是一個四元組(文件名,行號,函數名,文本)'表示通常爲堆棧軌跡打印的信息,文本是一個前導和尾隨空白字符串,如果源不可用,則爲無。「」「正如你看到的'function_name'是在元組中的索引2處。 – 2010-03-04 15:13:53

+0

試試/除了嘗試/除了解決方案可能會更好,但在我的情況下我需要處理,什麼函數會引發異常,所以這個答案對我來說是最好的!謝謝:) – 2010-03-04 15:50:57

8

將每個功能單獨包裝成「try/catch」。

try: 
    os.mkdir('/valid_created_dir') 
except Exception,e: 
    ## doing something, 
    ## quite probably skipping the next try statement 

try: 
    os.listdir('/invalid_path') 
except OSError, msg: 
    ## do something 

無論如何,這將有助於可讀性/理解。

+0

根據具體情況,第二個'try ... except'可能會從第一個'else:'塊中進入。 – 2010-03-04 14:57:28

+1

這會稍微改變邏輯 - 如果因爲目錄已經存在而導致mkdir失敗,它會嘗試執行'listdir'。 – 2010-03-04 15:18:37

+0

當然,我沒有制定整個解決方案,只是原則。 – jldupont 2010-03-04 15:24:22

1

如何簡單的解決方案:

try: 
    os.mkdir('/valid_created_dir') 
except OSError, msg: 
    # it_is_mkdir_whow_raise_ane_xception: 
    do some things 

try: 
    os.listdir('/invalid_path') 
except OSError, msg:  
    # it_is_listdir_who_raise_ane_xception: 
    do other things .. 
0

這裏的清潔方法:附加額外的信息,它發生在哪裏的異常,然後在一個統一的地方使用它:

import os, sys 
def func(): 
    try: 
     os.mkdir('/dir') 
    except OSError, e: 
     if e.errno != os.errno.EEXIST: 
      e.action = "creating directory" 
      raise 

    try: 
     os.listdir('/invalid_path') 
    except OSError, e: 
     e.action = "reading directory" 
     raise 

try: 
    func() 
except Exception, e: 
    if getattr(e, "action", None): 
     text = "Error %s: %s" % (e.action, e) 
    else: 
     text = str(e) 
    sys.exit(text) 

在實踐中,你要創建類似的mkdir函數的包裝和listdir如果你想這樣做,而不是分散你的代碼中的小塊嘗試/除了塊。

通常,我在錯誤信息中找不到這個級別的詳細信息非常重要(Python信息通常很多),但這是一種乾淨的方式。

相關問題