2010-01-05 155 views
17

我有一个程序,其中的一部分执行循环。在执行此循环期间,有例外。显然,我希望我的程序运行没有错误,但为了进步,我希望程序执行整个输入,而不是在抛出异常时停止。最简单的方法是通过执行except块。处理任意异常,打印默认异常消息

但是,当我这样做时,它的所有异常,并继续与该程序,我永远不会看到异常消息,我需要调试。

是否有办法except任意例外,并能够在except块中打印出异常消息?

回答

17
try: 
    #stuff 
except Exception as e: 
    print e 

traceback模块提供的各种功能,用于从异常对象(e,同上)提取更多的信息。

来源Errors and Exceptions

+3

请注意,'Exception,e'语法从2.6开始不推荐使用,从3.0开始停止工作。如果您的代码必须兼容2.x和3.x,请使用'Exception as e'代替。 (但是,如果您需要使用2.5或更低版本,则必须使用此语法。) – abarnert 2013-01-23 19:55:45

4
while True: 
    try: 
     # Do your stuff 
    except Exception, e: 
     print "Something happened: %s" % e 
+1

在Python 3中,改用'print(“发生了什么:{}”。format(e))'。 – amicitas 2013-01-16 17:17:13

12

考虑使用Python记录模块,这是给你很多的功能,日志后检查中存在问题。下面是一个使用日志模块来记录异常的一个简单的例子:

import logging 
LOG_FILE = '/tmp/exceptions.log' 
logging.basicConfig(filename=LOG_FILE,level=logging.ERROR) 

while True: 
try: 
    # Code that may throw exceptions 
except Exception, e: 
    logging.exception("An exception happened") 

通过使用作为都是在这里完成的异常信息被自动添加到日志消息的异常处理程序中的logging.exception功能。

4

我觉得这是更加有用的调试:

from traceback import print_exc 
try: 
    raise Exception("doh!") 
except: 
    print_exc() 
6

虽然詹姆斯的答案几乎总是你真正想要的东西,这不是很什么OP问:

有除了任何异常之外并且能够在except块中打印出异常消息的方法吗?

Exception实际上并不处理所有例外,只是你平时想捕获所有异常。特别是在2.5及更高版本中:

所有内置的非系统退出异常都是从这个类派生的。所有用户定义的异常也应该从这个类派生。

这留下了几件事情:

  • 内置系统退出的异常,像KeyboardInterrupt从用户击中^C(2.5及更高版本)
  • 用户定义的异常,唐“T遵循‘应该’

非常偶然,要处理类似的事情KeyboardInterrupt,在这种情况下,你使用的BaseException代替Exception。(对于一个列表,其中的例外是,并不Exception子见Exception hierarchy)。所以:

try: 
    # stuff 
except BaseException as e: 
    print e 

和(通常暂时在调试时),有时你确实要处理绝对一切。在2.7中,包括定义为旧式类的异常;在2.5及更早版本中,它还包含字符串。处理所有这些可能性的唯一方法是使用裸except然后用sys.exc_info(和可选,重新raise任何你不想处理):

try: 
    # stuff 
except: 
    type, value, traceback = sys.exc_info() 
    print value 

作为一个方面说明,我使用上面的新式except语法(except Exception as e)。这适用于2.6及更高版本,包括3.x.旧式语法(except Exception, e)在2.6中不推荐使用,并且在3.0中停止工作,但如果要使用较旧的2.x版本,则需要使用它。