2013-07-23 74 views
1

我知道可以使用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.''' 

我写了一个简单的源到源编译器,它有很多类似的异常这些,我不知道我怎么可以在打印它们时忽略这些异常。我如何确保将异常打印到控制台,即使它们被忽略?

回答

7

您可以打印像这样的异常。

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

编辑:

由于user1354557,gcbirzan,和乔纳森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

你可能会使用'traceback'的其他答案更好。 'print e'将只打印e - 这通常意味着调用'ValueError'的字符串“message”。与追溯。print_exc()',你会得到异常的模块+行号和异常的实际类型。 –

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

+1不知道为什么有人-1'd你 –

4

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

1

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

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

不知道为什么downvote - 再次提高例外是非常有用的。 – 2rs2ts

+1

只需要单独输入'raise'就可以重新产生异常(虽然我不是downvoter)。 – Paolo

+0

它不仅可能,而且更喜欢使用'raise'来重新引发异常。 – kindall

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元组,该错误消息,和一个回溯对象)和frame(其包括与参考当前的代码对象,从中可以获取其名称,以及源文件名和行号)。

相关问题