[英]How to raise exception when function call is missing an argument in 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.