Sobes.tech
Middle+

Ce mecanisme există pentru a perturba funcționarea unei părți a proiectului?

sobes.tech AI

Răspuns de la AI

  • Excepții (Exceptions): Permite oprirea execuției codului în cazul unei erori și transferul controlului către blocurile begin/rescue/ensure.

    begin
      # Cod care poate provoca o eroare
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Tratarea unei erori specifice
      puts "Eroare de împărțire la zero: #{e.message}"
      # Posibilă înregistrare sau execuție alternativă
    rescue StandardError => e
      # Tratarea altor erori standard
      puts "A apărut o altă eroare: #{e.message}"
    ensure
      # Cod care se execută întotdeauna, indiferent dacă există eroare sau nu
      puts "Sfârșitul blocului"
    end
    
  • Raise: Declanșarea explicită a unei excepții, atât pentru clasele de erori standard, cât și pentru cele personalizate.

    # Declanșare normală a unei excepții
    raise "Ceva nu a mers bine"
    
    # Declanșare cu o clasă de eroare specifică
    raise MyCustomError, "Valoare invalidă"
    
  • exit, abort, Kernel#exit!: Metode pentru terminarea execuției programului. exit! termină programul imediat, fără a apela handlerii at_exit.

    # Încheiere normală a programului
    exit(0) # 0 indică o încheiere cu succes
    
    # Încheiere cu eroare
    abort("Încheiere din cauza unei erori critice")
    
    # Încheiere forțată
    Kernel.exit!(1)
    
  • Thread#raise: Permite declanșarea unei excepții într-un alt fir de execuție.

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Fir interceptat: #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Oprirea firului"
    thread.join
    
  • Erori de programare (logice, sintactice): Codul scris greșit poate duce la eșecuri în timpul execuției.

    # Eroare sintactică (lipsă end)
    def my_method
      puts "Salut"
    
    # Eroare logică (buclă infinită)
    while true
      puts "Buclă"
    end
    
  • Semnale ale sistemului de operare (SIGTERM, SIGINT și altele): Pot întrerupe execuția programului din exterior.

    # Exemplu simplu de tratare a semnalului SIGINT (Ctrl+C)
    Signal.trap("INT") { puts "\nSemnal SIGINT capturat. Încheiere..."; exit }
    
    loop { sleep 1 }
    
  • Aserțiuni (mai ales în timpul dezvoltării și testării): Mecanisme de verificare a condițiilor, care, dacă sunt încălcate, aruncă o excepție sau efectuează o altă acțiune. În Ruby, deseori implementate cu biblioteci de testare.

    # Exemplu cu biblioteca MiniTest
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_diviziune
        # Afirmare: rezultatul împărțirii lui 4 la 2 este 2
        assert_equal 2, 4 / 2
        # Afirmare: împărțirea la zero trebuie să arunce ZeroDivisionError
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end