4

我知道使用 try...except 语句可以忽略 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.'''

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

4

5 回答 5

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)
于 2013-07-23T22:37:00.290 回答
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

这是你要找的吗?

于 2013-07-23T22:38:31.793 回答
4

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

于 2013-07-23T22:38:35.300 回答
1

忽略,我想你的意思是你想打印它,但不捕捉它,并让它在调用堆栈中冒泡。您可以通过捕获异常、打印它然后重新抛出它来做到这一点。

try :
  # do something
except Exception as e:
  print e
  raise e
于 2013-07-23T22:38:59.050 回答
0

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

import sys

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

sys.settrace(print_exceptions)

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

如果你想自定义输出,你可以从中挖掘出你想要的信息arg(它是异常类型、错误消息和回溯对象的三元组)和frame(其中包括对当前代码对象的引用,来自可以得到它的名字,以及源文件名和行号)。

于 2013-07-23T22:57:11.033 回答