Sobes.tech
Middle+

Jaké mechanismy existují pro narušení práce části projektu?

sobes.tech AI

Odpověď od AI

  • Výjimky (Exceptions): Umožňují zastavit provádění kódu při vzniku chyby a předat řízení blokům begin/rescue/ensure.

    begin
      # Kód, který může způsobit chybu
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Zpracování specifické chyby
      puts "Chyba dělení nulou: #{e.message}"
      # Možná logování nebo alternativní provedení
    rescue StandardError => e
      # Zpracování jiných standardních chyb
      puts "Nastala jiná chyba: #{e.message}"
    ensure
      # Kód, který se provádí vždy, bez ohledu na přítomnost chyby
      puts "Ukončení bloku"
    end
    
  • Raise: Explicitní vyvolání výjimky, jak pro standardní, tak pro uživatelské třídy chyb.

    # Obvyklé vyvolání výjimky
    raise "Něco se pokazilo"
    
    # Vyvolání s konkrétní třídou chyby
    raise MyCustomError, "Neplatná hodnota"
    
  • exit, abort, Kernel#exit!: Metody pro ukončení běhu programu. exit! ukončí program okamžitě, bez volání handlerů at_exit.

    # Obvyklé ukončení programu
    exit(0) # 0 - úspěšné ukončení
    
    # Ukončení s chybou
    abort("Ukončení kvůli kritické chybě")
    
    # Vynucené ukončení
    Kernel.exit!(1)
    
  • Thread#raise: Umožňuje vyvolat výjimku v jiném vlákně.

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Vlákno zachyceno: #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Zastavení vlákna"
    thread.join
    
  • Programové chyby (logické, syntaktické): Nesprávně napsaný kód může vést k selhání provádění.

    # Syntaktická chyba (chybí end)
    def my_method
      puts "Ahoj"
    
    # Logická chyba (nekonečná smyčka)
    while true
      puts "Smyčka"
    end
    
  • Signály operačního systému (SIGTERM, SIGINT a další): Mohou přerušit běh programu zvenčí.

    # Jednoduchý příklad zpracování signálu SIGINT (Ctrl+C)
    Signal.trap("INT") { puts "\nZachycen SIGINT. Ukončuji..."; exit }
    
    loop { sleep 1 }
    
  • Assertions (zejména při vývoji a testování): Mechanismy kontroly podmínek, při jejichž porušení se vyvolá výjimka nebo provede jiná akce. V Ruby se často realizují pomocí knihoven pro testování.

    # Příklad s použitím knihovny MiniTest
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_deleni
        # Tvrzení: výsledek dělení 4 dvěma je 2
        assert_equal 2, 4 / 2
        # Tvrzení: dělení nulou by mělo vyvolat výjimku ZeroDivisionError
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end