我连续有很多行可能会引发异常,但无论如何,它仍然应该继续下一行。如何在不单独尝试捕获可能引发异常的每个语句的情况下做到这一点?
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
我认为只有当异常很严重时代码才应该在异常之后继续运行(计算机会烧毁或整个系统会搞砸,它应该停止整个程序,但是对于许多小事情也会抛出异常,例如连接失败等)我通常在异常处理方面没有任何问题,但在这种情况下,我使用的是第 3 方库,它很容易为小事情引发异常。
在查看 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