Menu
Coddy logo textTech

ensure e raise

Fa parte della sezione Logica e flusso del percorso Ruby di Coddy. Lezione 46 di 56.

Altri due elementi completano gli strumenti per la gestione degli errori.

ensure è un blocco che viene eseguito in ogni caso, sia che begin termini normalmente, sia che un ramo rescue intercetti un’eccezione, sia persino che l’eccezione non venga intercettata. È qui che inserisci il codice di pulizia:

begin
  puts "opening file"
  raise "something broke"
rescue
  puts "caught it"
ensure
  puts "closing file"
end
# apertura del file
# eccezione intercettata
# chiusura del file

raise è il modo in cui crei la tua eccezione. Passa una stringa per il messaggio, oppure una classe e un messaggio:

def withdraw(amount)
  raise ArgumentError, "amount must be positive" if amount <= 0
  # ... effettua il prelievo
end

La convenzione consiste nel raise subito, all’inizio di un metodo, per fallire rapidamente quando gli argomenti sono errati. Chi chiama può usare rescue se dispone di una strategia di recupero sensata, oppure lasciar propagare l’errore.

challenge icon

Sfida

Facile

Definisci un metodo safe_divide(a, b) che:

  • Solleva ArgumentError con il messaggio "b cannot be zero" se b == 0
  • Altrimenti restituisce a / b

Poi leggi due numeri interi dall'input. Chiama safe_divide all'interno di begin / rescue / ensure:

  • In caso di successo, stampa Result: <value>
  • In caso di ArgumentError, stampa Error: <message>
  • In ensure, stampa sempre Done.

Per l'input 10 / 2, l'output è:

Result: 5
Done.

Per l'input 10 / 0:

Error: b cannot be zero
Done.

Provalo tu

# TODO: definisci safe_divide(a, b), che solleva ArgumentError quando b == 0

a = gets.to_i
b = gets.to_i

# TODO: begin ... stampa Result; rescue ArgumentError => e ... stampa Error; ensure ... stampa Done.
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Ruby online