Gestione degli errori

Una gestione degli errori è presente in quasi tutti i linguaggi moderni, di cui la maggior parte utilizza un approccio basato su classi.

Approccio basato su classi

Il Runtime Environment prevede la definizione di una classe madre rappresentante la generica eccezione che contiene almeno:

  • identificatore
  • rappresentazione dello stack corrente

Gli errori possono essere sollevati:

  • automaticamente da anomalie a runtime
  • dallo sviluppatore tramite throw è raise

Si può anche impostare il codice da eseguire quando una eccezione viene sollevata. Se il codice per gestire il problema non è previsto, il programma stampa l’errore e termina.

try:
	<blocco con possibile eccezione>
except e_1:
	pass
except (e_2, e_3):
	...
except e_n as inst:
	# argomenti dell'errore
	inst.args
except:
	<gestisce una generica anomialia>
else:
	<codice da eseguire in assenza di eccezioni>
finally:
	<codice da eseguire comunque in uscita>

e_n è sottoclasse di Exception.

class NuovoErrore(Exception):
    def __init__(self, message="Ho commesso un errore, mi dispace!", errors=None):
        self.message = message
        self.errors = errors
    def __str__(self):
        return self.message
 
# solleva l'eccezione NuovoErrore
raise NuovoErrore
 
raise NuovoErrore("Messaggio di errore custom")

L’errore ha un attributo args, che contiene il messaggio di errore e il numero dell’errore. Per stampare lo stack serve importare traceback.

import traceback 
try:
    raise NuovoErrore("Questa volta non è colpa mia!",errors=2)
except NuovoErrore as inst:
    print(inst.args)
    print(inst.errors)
    traceback.print_exc()