Qual è il modo più elegante di ripetere qualcosa dopo aver causato un'eccezione in python?Come ripetere qualcosa su eccezione in python?
Ho qualcosa di simile [pseudo codice come un esempio]:
try:
do_some_database_stuff()
except DatabaseTimeoutException:
reconnect_to_database()
do_some_database_stuff() # just do it again
Ma immaginate se non ho una bella funzione, ma un sacco di codice, invece. Il codice duplicato non è molto bello.
quindi penso che questo è leggermente migliore:
while True:
try:
do_some_database_stuff()
break
except DatabaseTimeoutException:
reconnect_to_database()
che è abbastanza buono, se l'eccezione risolve davvero il problema. Se non ho bisogno di un contatore per evitare un ciclo indefinito:
i = 0
while i < 5:
try:
do_some_database_stuff()
break
except DatabaseTimeoutException:
reconnect_to_database()
i += 1
Ma poi non so davvero se ha funzionato in modo che sia anche:
while i <= 5:
try:
do_some_database_stuff()
break
except DatabaseTimeoutException:
if i != 5:
reconnect_to_database()
else:
raise DatabaseTimeoutException
i += 1
Come si può vedere che inizia a diventare molto disordinato.
Qual è il modo più elegante di esprimere questa logica?
- provare qualcosa
- se non riesce applicare correzione
- provare n più volte tra cui la correzione
- se continua a fallire darmi un errore per evitare che un ciclo indefinito
La risposta principale a queste domande è "Ma ogni volta che vedi [un per-else] costruisci, un'alternativa migliore è ...". Sono d'accordo. Meglio avvolgere il blocco di codice in una funzione e utilizzare il rendimento piuttosto che l'interruzione. – Dunes
@Dunes: è per questo che ho fornito un'alternativa, per coloro che trovano un po 'troppo il contrario. Sono fuori discussione, personalmente, è certamente una questione di gusti. –
La versione 'for-else' non è equivalente poiché eseguirà' reconnect_to_database' 5 volte su 5 errori invece di 4. – Veedrac