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.

Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Francesco
Hai dubbi su questo articolo?