如何识别哪个函数调用在Python中引发异常?

时间:2010-03-04 14:40:43

标签: python exception

我需要确定谁提出异常来处理更好的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中处理这个?

4 个答案:

答案 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消息通常很多),但这是一种干净的方法。