Sobes.tech
Middle+

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 gestori at_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