我知道可以使用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.'''
我编写了一个简单的源到源编译器,它有很多像这样的例外,我不确定如何在打印它们时忽略异常。如果异常被忽略,我怎样才能确保将异常打印到控制台?
答案 0 :(得分:10)
你可以打印这样的例外。
try:
x = 1 / 0
except Exception as e:
print e
修改强>
正如user1354557,gcbirzan和Jonathan Vanasco指出的那样,您可以使用traceback
和logging
模块来获取更准确的错误消息。以这些方式打印的错误消息将更加冗长,这通常是一件好事。
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} (包括对当前代码对象的引用,可以从中获取其名称,以及源文件名和行号)。