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

时间:2010-01-05 11:29:04

标签: python exception-handling

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

然而,当我这样做时,它except是所有异常并继续执行程序,我永远不会看到异常消息,我需要调试它。

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

5 个答案:

答案 0 :(得分:19)

try:
    #stuff
except Exception as e:
    print e

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

来源Errors and Exceptions

答案 1 :(得分: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函数,就像在此处所做的那样,异常信息会自动添加到日志消息中。

答案 2 :(得分:6)

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

  

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

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

  

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

这遗漏了一些事情:

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

偶尔,您希望处理KeyboardInterrupt之类的内容,在这种情况下,您使用KeyboardInterrupt代替Exception。 (参见BaseException以获取哪些例外是Exception子类的列表。)所以:

try:
    # stuff
except BaseException as e:
    print e

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

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版本,则需要使用它。

答案 3 :(得分:4)

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

答案 4 :(得分:4)

我发现这对调试更有用:

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