Sobes.tech
Middle+

Jakie mechanizmy istnieją, aby zakłócić działanie części projektu?

sobes.tech AI

Odpowiedź od AI

  • Wyjątki (Exceptions): Pozwalają zatrzymać wykonywanie kodu w przypadku wystąpienia błędu i przekazać kontrolę do bloków begin/rescue/ensure.

    begin
      # Kod mogący wywołać błąd
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Obsługa konkretnego błędu
      puts "Błąd dzielenia przez zero: #{e.message}"
      # Możliwość logowania lub alternatywnego wykonania
    rescue StandardError => e
      # Obsługa innych błędów standardowych
      puts "Wystąpił inny błąd: #{e.message}"
    ensure
      # Kod, który zawsze się wykonuje, niezależnie od błędu
      puts "Koniec bloku"
    end
    
  • Raise: Jawne wywołanie wyjątku, zarówno dla standardowych, jak i własnych klas błędów.

    # Normalne wywołanie wyjątku
    raise "Coś poszło nie tak"
    
    # Wywołanie z konkretną klasą błędu
    raise MyCustomError, "Nieprawidłowa wartość"
    
  • exit, abort, Kernel#exit!: Metody kończące działanie programu. exit! kończy program natychmiast, bez wywoływania obsługi at_exit.

    # Normalne zakończenie programu
    exit(0) # 0 oznacza pomyślne zakończenie
    
    # Zakończenie z błędem
    abort("Zakończenie z powodu krytycznego błędu")
    
    # Wymuszone zakończenie
    Kernel.exit!(1)
    
  • Thread#raise: Pozwala wywołać wyjątek w innym wątku.

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Przechwycono wątek: #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Zatrzymanie wątku"
    thread.join
    
  • Błędy programistyczne (logiczne, składniowe): Niepoprawnie napisany kod może prowadzić do awarii podczas wykonywania.

    # Błąd składniowy (brak end)
    def my_method
      puts "Cześć"
    
    # Błąd logiczny (nieskończona pętla)
    while true
      puts "Pętla"
    end
    
  • Sygnały systemu operacyjnego (SIGTERM, SIGINT itp.): Mogą przerwać działanie programu z zewnątrz.

    # Prosty przykład obsługi sygnału SIGINT (Ctrl+C)
    Signal.trap("INT") { puts "\nPrzechwycono SIGINT. Zakończenie..."; exit }
    
    loop { sleep 1 }
    
  • Asercje (zwłaszcza podczas rozwoju i testowania): Mechanizmy sprawdzania warunków, które w przypadku naruszenia rzucają wyjątek lub wykonują inną akcję. W Ruby często realizowane za pomocą bibliotek testowych.

    # Przykład z użyciem biblioteki MiniTest
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_division
        # Asercja: wynik dzielenia 4 przez 2 to 2
        assert_equal 2, 4 / 2
        # Asercja: dzielenie przez zero powinno wywołać ZeroDivisionError
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end