在Python中,是否可以打印异常,即使它们被忽略?

时间:2013-07-23 22:35:46

标签: python

我知道可以使用try ... except语句忽略Python中的异常。是否有可能在Python发生时忽略Python中的异常,但仍然可以打印它们?

我尝试忽略此处的异常,因此,遇到异常时不打印:

try:
    num = 0
    if num == 0:
        raise Exception("Num must not be 0!")
except Exception:
    pass
    '''The exception is ignored, and is not printed.'''

我编写了一个简单的源到源编译器,它有很多像这样的例外,我不确定如何在打印它们时忽略异常。如果异常被忽略,我怎样才能确保将异常打印到控制台?

5 个答案:

答案 0 :(得分:10)

你可以打印这样的例外。

try:
    x = 1 / 0
except Exception as e:
    print e

修改

正如user1354557,gcbirzan和Jonathan Vanasco指出的那样,您可以使用tracebacklogging模块来获取更准确的错误消息。以这些方式打印的错误消息将更加冗长,这通常是一件好事。

import traceback

try:
    x = 1 / 0
except Exception as e:
    print traceback.format_exc()  # I prefer this to traceback.print_exc()


import logging

try:
    x = 1 / 0
except Exception as e:
    logging.exception(e)

答案 1 :(得分:6)

如果要打印堆栈跟踪,可以使用traceback模块:

import traceback
try:
    0/0
except:
    traceback.print_exc()

这会打印出如下内容:

Traceback (most recent call last):
  File "example.py", line 3, in <module>
    0/0
ZeroDivisionError: integer division or modulo by zero

这是你要找的吗?

答案 2 :(得分:4)

您应该查看日志记录模块。它支持使用traceback记录异常(通过logger.exception或将exc_info作为关键字参数传递给任何日志记录功能)。

答案 3 :(得分:1)

忽略,我想你的意思是你想打印它,但不能抓住它,并允许它冒泡调用堆栈。您可以通过捕获异常,打印它,然后重新抛出它来实现。

try :
  # do something
except Exception as e:
  print e
  raise e

答案 4 :(得分:0)

即使在使用跟踪功能编写的代码(例如库模块)中,也可以全局执行此操作。

import sys

def print_exceptions(frame, event, arg):
    if event == "exception":
        sys.excepthook(*arg)
    return print_exceptions

sys.settrace(print_exceptions)

请注意,trace函数会在每个语句生效时调用,因此可能会大大减慢脚本的执行速度。另一个小问题是任何未处理的异常将被打印两次(一次是通过这个钩子,当退出脚本时再由Python本身打印)。

如果要自定义输出,可以从arg中挖掘出所需的信息(它是异常类型的3元组,错误消息和追溯对象)和{{1} (包括对当前代码对象的引用,可以从中获取其名称,以及源文件名和行号)。