我有很多连续的代码行可能会抛出异常,但无论如何都应该继续执行下一行。如何在不逐个捕获每个可能抛出异常的语句的情况下实现这一点?
try:
this_may_cause_an_exception()
but_I_still_wanna_run_this()
and_this()
and_also_this()
except Exception, e:
logging.exception('An error maybe occured in one of first occuring functions causing the others not to be executed. Locals: {locals}'.format(locals=locals()))
看一下上面的代码,所有函数都可能抛出异常,但无论是否抛出异常,它仍应执行下一个函数。有没有一种好的方法可以做到这一点?
我不想这样做:
try:
this_may_cause_an_exception()
except:
pass
try:
but_I_still_wanna_run_this()
except:
pass
try:
and_this()
except:
pass
try:
and_also_this()
except:
pass
我认为只有当异常是关键性的(比如电脑会烧掉或整个系统会被搞砸),程序才应该停止运行,但对于许多小事情,也会抛出异常,例如连接失败等。我通常在异常处理上没有任何问题,但在这种情况下,我正在使用一个第三方库,它很容易因为小事情而引发异常。在查看了m4spy的回答后,我想到是否有可能编写一个装饰器,即使其中一个函数行引发了异常,每一行代码都能继续执行。
像这样的东西可能不错:
def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
except Exception:
logging.exception('...')
some_special_python_keyword # which causes it to continue executing the next line
return _wrapper
或者像这样:
def silent_log_exceptions(func):
@wraps(func)
def _wrapper(*args, **kwargs):
for line in func(*args, **kwargs):
try:
exec line
except Exception:
logging.exception('...')
return _wrapper
@silent_log_exceptions
def save_tweets():
a = requests.get('http://twitter.com)
x = parse(a)
bla = x * x