Sobes.tech
Middle+

Kokie mechanizmai egzistuoja, kad būtų sutrikdytas projekto atskiros dalies darbas?

sobes.tech AI

Atsakymas iš AI

  • Išimtys (Exceptions): Leidžia sustabdyti kodo vykdymą įvykus klaidai ir perduoti valdymą begin/rescue/ensure blokams:

    begin
      # Kodas, kuris gali sukelti klaidą
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Konkretus klaidos apdorojimas
      puts "Dalyba iš nulio klaida: #{e.message}"
      # Galimas žurnalo įrašymas ar alternatyvus vykdymas
    rescue StandardError => e
      # Kitų standartinių klaidų apdorojimas
      puts "Įvyko kita klaida: #{e.message}"
    ensure
      # Kodas, kuris visada vykdomas, nepriklausomai nuo klaidos
      puts "Bloko pabaiga"
    end
    
  • Raise: Aiškus išimties iškėlimas, tiek standartinių, tiek naudotojo sukurtų klaidų klasėms:

    # Įprastas iškėlimas
    raise "Kažkas nepavyko"
    
    # Kėlimas su konkrečia klaidos klase
    raise MyCustomError, "Netinkama reikšmė"
    
  • exit, abort, Kernel#exit!: Programos užbaigimo metodai:

    # Įprastas programos užbaigimas
    exit(0) # 0 - sėkmingas užbaigimas
    
    # Baigimas su klaida
    abort("Užbaigimas dėl kritinės klaidos")
    
    # Priverstinis užbaigimas
    Kernel.exit!(1)
    
  • Thread#raise: Leidžia iškelti išimtį kitame gijoje:

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Gija pagauta: #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Gijos sustabdymas"
    thread.join
    
  • Programinės klaidos (loginės, sintaksinės): Netinkamai parašytas kodas gali sukelti klaidų:

    # Sintaksinė klaida (trūksta end)
    def my_method
      puts "Labas"
    
    # Loginė klaida (begalinis ciklas)
    while true
      puts "Ciklas"
    end
    
  • Operacinės sistemos signalai (SIGTERM, SIGINT ir kt.): Gali nutraukti programos vykdymą iš išorės:

    # Paprastas SIGINT (Ctrl+C) apdorojimo pavyzdys
    Signal.trap("INT") { puts "\nSIGINT pagautas. Baigiu..."; exit }
    
    loop { sleep 1 }
    
  • Tvirtinimai (Assertions) (ypač kūrimo ir testavimo metu): Patikrinimo mechanizmai, kurie išmeta išimtį arba atlieka kitą veiksmą, jei sąlygos pažeidžiamos:

    # Pavyzdys naudojant MiniTest biblioteką
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_dalijimą
        # Tvirtinimas: 4 padalinta iš 2 yra 2
        assert_equal 2, 4 / 2
        # Tvirtinimas: dalijimas iš nulio turi išmesti ZeroDivisionError
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end