Sobes.tech
Middle+

Millised mehhanismid on olemas projekti eraldi osa töö rikkumiseks?

sobes.tech AI

Vastus AI-lt

  • Erandid (Exceptions): Võimaldavad katkestada koodi täitmise, kui tekib viga, ja suunata juhtimine begin/rescue/ensure plokkidele:

    begin
      # Kood, mis võib põhjustada vea
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Spetsiifilise vea töötlemine
      puts "Nulliga jagamise viga: #{e.message}"
      # Võimalik logimine või alternatiivne täitmine
    rescue StandardError => e
      # Muude standardsete vigade töötlemine
      puts "Muud vead: #{e.message}"
    ensure
      # Kood, mis täidetakse alati, olenemata vea olemasolust
      puts "Bloki lõpp"
    end
    
  • Raise: Selge erandite esilekutsumine, nii standardsete kui ka kasutaja määratletud vigade klasside jaoks:

    # Tavaline erandite esilekutsumine
    raise "Midagi läks valesti"
    
    # Erandite esilekutsumine konkreetse klassiga
    raise MyCustomError, "Kehtetu väärtus"
    
  • exit, abort, Kernel#exit!: Programm lõpetamise meetodid:

    # Tavaline programmi lõpetamine
    exit(0) # 0 - edukas lõpetamine
    
    # Viga lõpetamine
    abort("Käivitus kriitilise vea tõttu")
    
    # Sunni lõpetamine
    Kernel.exit!(1)
    
  • Thread#raise: Võimaldab teises niidis esile kutsuda erandi:

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Niit tabatud: #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Niit peatub"
    thread.join
    
  • Programmilised vead (loogilised, süntaktilised): Valesti kirjutatud kood võib põhjustada tõrkeid:

    # Süntaksiviga (puudub end)
    def my_method
      puts "Tere"
    
    # Loogiline viga (lõpmatu tsükkel)
    while true
      puts "Tsükkel"
    end
    
  • Operatsioonisüsteemi signaalid (SIGTERM, SIGINT ja teised): Võivad katkestada programmi täitmise väljastpoolt:

    # Lihtne näide SIGINT (Ctrl+C) töötlemisest
    Signal.trap("INT") { puts "\nSIGINT tabatud. Lõpetan..."; exit }
    
    loop { sleep 1 }
    
  • Väited (Assertions) (eriti arenduse ja testimise ajal): Kontrollimehhanismid, mis, rikkudes tingimusi, viskavad välja erandi:

    # Näide MiniTest raamatukoguga
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_jagamist
        # Väide: 4 jagatud 2-ga on 2
        assert_equal 2, 4 / 2
        # Väide: jagamine nulliga viskab ZeroDivisionError
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end