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ługiat_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