簡體   English   中英

如何確定哪個函數調用在 Python 中引發異常?

[英]How to identify what function call raise an exception in Python?

我需要確定誰提出了一個異常來處理更好的 str 錯誤,有沒有辦法?

看看我的例子:

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 中?

如果您有完全獨立的任務要執行取決於哪個函數失敗,如您的代碼所示,那么單獨的 try/exec 塊,如現有答案所暗示的那樣,可能會更好(盡管您可能需要跳過第二部分,如果第一個失敗了)。

如果您在任何一種情況下都需要做很多事情,並且只有少量工作取決於哪個功能失敗,那么分離可能會產生大量重復和重復,因此您建議的形式可能更可取。 在這種情況下,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

當然,您將使用if檢查來確定要進行的處理,而不是print

單獨包裝“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 

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

簡單的解決方案怎么樣:

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 ..

這是干凈的方法:在異常發生的地方附加附加信息,然后在一個統一的地方使用它:

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 等函數創建包裝器,而不是在你的代碼中散布小的 try/except 塊。

通常,我不認為錯誤消息中的這種詳細程度如此重要(Python 消息通常很多),但這是一種干凈的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM