Gestione delle Eccezioni : ensure
Potrebbe essereci del lavoro di pulizia da fare quando un metodo finisce il suo lavoro. Magari un file aperto dovrebbe essere chiuso, i dati bufferizzati dovrebbero essere sottoposti a flush, etc. Se ci fosse soltanto un punto d'uscita per ogni metodo , potremmo tranquillamente mettere il nostro codice di ripulitura in un posto ed essere certi che sarebbe eseguito; comunque, un metodo può finire in diversi punti, o il nostro codice di ripulitura potrebbe venire saltato a causa di un eccezione.
begin
file = open("/tmp/un_file" , "w")
# ... scrive sul file ...
file.close
end
Nell'esempio precedente , se accadesse un eccezione durante la sezione di codice dove scriviamo nel file, il file verrebbe lasciato aperto. E noi non vogliamo questo tipo di ridondanza :
begin
file = open("/tmp/un_file" , "w")
# ... scrive sul file...
file.close
rescue
file.close
fail # lancia un eccezione
end
Questo è goffo , e può sfuggire di mano quando
il codice diventa più complesso poiché dobbiamo
gestire ogni return e break.
Per questa ragione aggoiungiamo un'altra keyword allo
schema "begin...rescue...end" , che
è ensure. Il blocco di codice
ensure verrà eseguito indipendentemente
dal successo o al fallimento del blocco begin .
begin
file = open("/tmp/un_file" , "w")
# ... scrive sul file...
rescue
# ... gestiamo le eccezioni...
ensure
file.close # ... e questo succede sempre .
end
E' possibile usare ensure senza
rescue, o viceversa, ma se sono usati insieme
nello stesso blocco begin...end, il
rescue deve precedere l'ensure.