在Python中打印异常,而不是引发异常

3
我想捕获Python的异常并打印它,而不是重新抛出它。例如:
def f(x):
    try:
        return 1/x
    except:
        print <exception_that_was_raised>   

这应该做到:
>>> f(0)
'ZeroDivisionError'

在不触发任何异常的情况下,有没有一种方法可以做到这一点?除了在一个巨大的try-except-except...except子句中列出每个可能的异常之外,还有其他方法吗?

3个回答

9

如果你想要基本异常类的名称,比如你的情况下的ZeroDivisionError,请使用异常或e.__class__.__name__属性。

In [30]: def f(x):
        try:
                return 1/x
        except Exception as e:
            print e.message
   ....:         

In [31]: f(2)
Out[31]: 0

In [32]: f(0)
integer division or modulo by zero

在Python 3.x中,message属性已被删除,因此您可以直接使用print(e)e.args [0],而e.__class__.__name__保持不变。

1
或者如果你只想要异常的名称:print e.__class__.__name__ - mgilson
@mgilson的评论确实是OP所要求的内容;print repr(e)也可以。 - Burhan Khalid
好的,但是如果你引发一个 class Whoa: pass 的实例,这将不起作用。 - alex_jordan
@alex_jordan--如果你提出的东西不是异常,那么你就会得到你应得的结果。我认为......快速查看文档,我甚至不确定行为是否定义良好。 - mgilson
@BurhanKhalid 我认为 repr(e) 返回的是 e.__class__.__name__e.args 的组合,即输出为 ZeroDivisionError('integer division or modulo by zero',) - Ashwini Chaudhary

3
这是我的工作方式:

try:
    0/0
except Exception as e:
    print e

2
try:
    0/0
except ZeroDivisionError,e:
    print e
#will print "integer division or modulo by zero"

类似这样的, Pythonic鸭子类型让我们能够即时将错误实例转换为字符串=) 祝好运=)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接