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
上面)中提取更多信息.
来源错误和例外
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
在异常处理程序中使用此函数,可以自动将异常信息添加到日志消息中.
虽然詹姆斯的答案几乎总是你真正想要的,但这并不是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版本,则需要使用它.
我发现这对于调试更有用:
from traceback import print_exc
try:
raise Exception("doh!")
except:
print_exc()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7901 次 |
最近记录: |