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 fileraise è 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
endLa 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.
Sfida
FacileDefinisci un metodo safe_divide(a, b) che:
- Solleva
ArgumentErrorcon il messaggio"b cannot be zero"seb == 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, stampaError: <message> - In
ensure, stampa sempreDone.
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.
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Panoramica dei metodi delle stringheInterpolazione di stringheIterare sulle stringheDividere e unireRiepilogo - Tessitore di stringhe4Blocchi, Proc e Lambda
Che cos’è un Block?do..end vs parentesi graffeLa keyword yieldParametri del BlockProc e LambdaRiepilogo - Iteratore personalizzato7Hash in Ruby - Parte 2
Hash.new con valori predefinitiIterare sugli hashHash annidatiUnire e trasformareRipasso - Contatore di frequenza10Progetto - Registri degli studenti
Panoramica del progettoAggiungere uno studente2Intervalli
Che cos'è un intervallo?Metodi degli intervalliIntervalli in Case / WhenRiepilogo - Esercitarsi con gli intervalli5La potenza di Enumerable
Select e RejectConcatenare MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRiepilogo - Pipeline di dati3Array bidimensionali
Basi degli array 2DAccesso agli elementi 2DIterare sugli array 2DPattern comuni con array 2DRiepilogo - Operazioni sulle matrici6Progetto - Gestore della biblioteca
Panoramica del progettoAggiungere un libro9Gestione degli errori
Che cos’è un’eccezione?begin / rescueClausole rescue multipleensure e raiseRipasso - Calcolatrice sicuraEsercitati da solo: Compilatore Ruby online