我需要确定谁提出异常来处理更好的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中处理这个?
答案 0 :(得分:9)
如果您有完全独立的任务要执行,具体取决于哪个功能失败,正如您的代码似乎显示的那样,那么单独的try / exec块(如现有答案所示)可能会更好(尽管您可能需要跳过第二个部分,如果第一个失败了。)
如果你在任何一种情况下都需要做很多事情,而且只有少量的工作取决于哪个功能失败,那么分离可能会产生大量的重复和重复,所以你建议的形式可能更好。在这种情况下,Python标准库中的traceback模块可以提供帮助:
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
检查来确定要执行的处理。
答案 1 :(得分: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
无论如何,这将有助于提高可读性/理解力。
答案 2 :(得分: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 ..
答案 3 :(得分: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等函数创建包装器,而不是在代码中散布小的try / except块。
通常,我没有发现错误消息中的这种详细程度如此重要(Python消息通常很多),但这是一种干净的方法。