Quali meccanismi esistono per interrompere il funzionamento di una parte del progetto?
sobes.tech AI
Risposta dell'AI
-
Eccezioni (Exceptions): Consentono di interrompere l'esecuzione del codice in caso di errore e di trasferire il controllo ai blocchi
begin/rescue/ensure.begin # Codice che può causare un errore result = 1 / 0 rescue ZeroDivisionError => e # Gestione errore specifico puts "Errore di divisione per zero: #{e.message}" # Possibile registrazione o esecuzione alternativa rescue StandardError => e # Gestione di altri errori standard puts "Si è verificato un altro errore: #{e.message}" ensure # Codice che viene sempre eseguito, indipendentemente dall'errore puts "Fine del blocco" end -
Raise: Scatenare esplicitamente un'eccezione, sia per classi di errore standard che personalizzate.
# Scatenamento normale di un'eccezione raise "Qualcosa è andato storto" # Scatenamento con una classe di errore specifica raise MyCustomError, "Valore non valido" -
exit,abort,Kernel#exit!: Metodi per terminare l'esecuzione del programma.exit!termina immediatamente senza chiamare i gestoriat_exit.# Terminazione normale del programma exit(0) # 0 indica terminazione con successo # Terminazione con errore abort("Terminazione a causa di errore critico") # Terminazione forzata Kernel.exit!(1) -
Thread#raise: Permette di scatenare un'eccezione in un altro thread di esecuzione.
thread = Thread.new do begin loop { sleep 1 } rescue => e puts "Thread intercettato: #{e.class}" end end sleep 2 thread.raise StandardError, "Interruzione del thread" thread.join -
Errori di programmazione (logici, sintattici): Codice scritto male può portare a fallimenti durante l'esecuzione.
# Errore sintattico (manca end) def my_method puts "Ciao" # Errore logico (ciclo infinito) while true puts "Loop" end -
Segnali del sistema operativo (SIGTERM, SIGINT, ecc.): Possono interrompere l'esecuzione del programma dall'esterno.
# Esempio semplice di gestione del segnale SIGINT (Ctrl+C) Signal.trap("INT") { puts "\nSegnale SIGINT intercettato. Terminazione..."; exit } loop { sleep 1 } -
Asserzioni (specialmente durante sviluppo e test): Meccanismi di verifica delle condizioni, che, se violate, lanciano un'eccezione o eseguono un'altra azione. In Ruby, spesso implementate con librerie di test.
# Esempio con la libreria MiniTest require 'minitest/autorun' class MyTest < Minitest::Test def test_divisione # Asserzione: il risultato di 4 diviso 2 è 2 assert_equal 2, 4 / 2 # Asserzione: divisione per zero dovrebbe generare ZeroDivisionError assert_raises(ZeroDivisionError) { 1 / 0 } end end