Quando lavoro con la gestione delle eccezioni, noto che spesso devo confrontarmi con quelle di cui non avevo idea. Soprattutto è evidente quando programmo un metodo che acquisisce i dati dal web. Potrebbe verificarsi un errore, ad esempio, a causa della perdita di connessione, posso gestirlo. Ma poi si verifica un altro errore, un errore diverso con la stessa causa - perdita di connessione. Ok, l'ho aggiunto. A volte succede ancora un altro. Quindi, il problema è che non sono mai abbastanza sicuro se ho gestito tutti i possibili errori che potrebbero verificarsi a causa di una determinata causa.
In un primo momento, ho pensato di inserire caratteri jolly e fare qualcosa come (esempio in Python):
try:
#do stuff
except:
#handle error
Ma presto si è rivelato un approccio sbagliato, perché se devo gestire, ad esempio, KeyboardInterrupt
, che viene generato quando un utente termina il programma, invece di essere gestito da un ambito, voglio che sia gestito da , è gestito da questo jolly, che non dovrebbe avere nulla a che fare con esso.
Quindi come gestisco le eccezioni che non conosco ma che potrebbero verificarsi (o non accadere)? Qualche tipo di exceptEverythingBut KeyboardInterrupt:
? Dubito che molte lingue lo abbiano nella loro sintassi.
EDIT1: un esempio davvero semplificato:
#!/usr/bin/python3 -u
# -*- coding: utf-8 -*-
try:
while True:
try:
print(1)
except:
print(2)
except KeyboardInterrupt:
print('end')
Quando premo Ctrl + C , voglio che stampi 'end' e finisca. Ma invece stampa 2 e continua l'esecuzione.
Se provo questo:
#!/usr/bin/python3 -u
# -*- coding: utf-8 -*-
try:
while True:
try:
print(1)
except KeyboardInterrupt:
break
except:
print(2)
except KeyboardInterrupt:
print('end')
termina, ma salta la% esterna% co_de e non stampa 'fine'. E non è quello che voglio. Quindi, l'unico modo che vedo è di impedire che l'ambito interno maneggi completamente except
. Ma non è possibile se c'è un KeyboardInterrupt
o except:
lì. Quindi, ho bisogno di specificare esattamente quali errori voglio gestire all'interno except KeyboardInterrupt:
. Ma, come ho detto all'inizio, non so sempre cosa possono essere.
Sto facendo questa domanda, perché il mio modo comune per farlo è lasciare che il programma fallisca inaspettatamente diverse volte, leggere i registri e aggiungere la gestione degli errori che non conoscevo nelle nuove versioni; tuttavia questo potrebbe essere solo un approccio ingenuo, quindi voglio sapere come è fatto da persone esperte.