在python中导致异常之后重复某些事情的最优雅方法是什么?
我有这样的东西[伪代码作为例子]:
try:
do_some_database_stuff()
except DatabaseTimeoutException:
reconnect_to_database()
do_some_database_stuff() # just do it again
Run Code Online (Sandbox Code Playgroud)
但想象一下,如果我没有一个很好的功能,而是很多代码.重复的代码不是很好.
所以我认为这稍微好一些:
while True:
try:
do_some_database_stuff()
break
except DatabaseTimeoutException:
reconnect_to_database()
Run Code Online (Sandbox Code Playgroud)
如果异常确实解决了问题,那就足够了.如果不是,我需要一个计数器来防止无限循环:
i = 0
while i < 5:
try:
do_some_database_stuff()
break
except DatabaseTimeoutException:
reconnect_to_database()
i += 1
Run Code Online (Sandbox Code Playgroud)
但后来我真的不知道它是否有效,所以它也是:
while i <= 5:
try:
do_some_database_stuff()
break
except DatabaseTimeoutException:
if i != 5:
reconnect_to_database()
else:
raise DatabaseTimeoutException
i += 1
Run Code Online (Sandbox Code Playgroud)
你可以看到它开始变得非常混乱.
表达这种逻辑的最优雅方式是什么?
您可以使用" for-else "循环:
for ii in range(5):
try:
do_some_database_stuff()
break
except DatabaseTimeoutException:
reconnect_to_database()
else:
raise DatabaseTimeoutException
Run Code Online (Sandbox Code Playgroud)
或者,没有:
for ii in range(5):
try:
do_some_database_stuff()
break
except DatabaseTimeoutException:
if ii == 4:
raise
reconnect_to_database()
Run Code Online (Sandbox Code Playgroud)