处理任意异常,打印默认异常消息

ins*_*get 18 python exception-handling

我有一个程序,其中一部分执行循环.在执行此循环期间,有例外.显然,我希望我的程序运行没有错误,但为了进步,我希望程序在整个输入上执行,而不是在抛出异常时停止.最简单的方法是实现一个except块.

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

有没有办法except任何异常,并能够打印出except块中的异常消息?

Jam*_*mes 20

try:
    #stuff
except Exception as e:
    print e
Run Code Online (Sandbox Code Playgroud)

traceback模块提供了各种功能,用于从异常对象(e上面)中提取更多信息.

来源错误和例外

  • 请注意,从2003开始,不推荐使用`Exception,e`语法,并从3.0开始停止工作.如果您的代码必须同时使用2.x和3.x,请使用`Exception as e`代替.(但是,如果需要使用2.5或更早版本,则必须使用此语法.) (4认同)

Ten*_*she 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")
Run Code Online (Sandbox Code Playgroud)

通过logging.exception在异常处理程序中使用此函数,可以自动将异常信息添加到日志消息中.


aba*_*ert 6

虽然詹姆斯的答案几乎总是你真正想要的,但这并不是OP所要求的:

有没有办法除了任何异常,并能够在except块中打印出异常消息?

Exception实际上并不处理所有异常,只是你通常想要捕获的所有异常.特别是在2.5及更高版本中:

所有内置的,非系统退出的异常都派生自此类.所有用户定义的异常也应该从该类派生.

这遗漏了一些事情:

  • 内置系统退出异常,例如KeyboardInterrupt来自用户点击^C(仅限2.5及更高版本)
  • 用户定义的异常,不遵循"应该"

很偶然,你想要处理的事情KeyboardInterrupt,在这种情况下你使用BaseException而不是Exception.(有关哪些异常是和不是子类的列表,请参阅异常层次结构Exception.)所以:

try:
    # stuff
except BaseException as e:
    print e
Run Code Online (Sandbox Code Playgroud)

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

try:
    # stuff
except:
    type, value, traceback = sys.exc_info()
    print value
Run Code Online (Sandbox Code Playgroud)

作为旁注,我正在使用上面的新式except语法(except Exception as e).这适用于2.6及更高版本,包括3.x. 旧式语法(except Exception, e)在2.6中已弃用,并且在3.0中停止工作,但如果您想使用较旧的2.x版本,则需要使用它.


Mat*_*ner 5

我发现这对于调试更有用:

from traceback import print_exc
try:
    raise Exception("doh!")
except:
    print_exc()
Run Code Online (Sandbox Code Playgroud)