我有一个程序,其中一部分执行循环。在执行此循环期间,有例外。显然,我希望我的程序运行没有错误,但为了进步,我希望程序在整个输入上执行,而不是在抛出异常时停止。最简单的方法是实现except
块。
然而,当我这样做时,它except
是所有异常并继续执行程序,我永远不会看到异常消息,我需要调试它。
有没有办法except
任意异常,并且能够在except
块中打印出异常消息?
答案 0 :(得分:19)
try:
#stuff
except Exception as e:
print e
traceback
模块提供了各种函数,用于从异常对象(e
,上面)中提取更多信息。
答案 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()