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