Aké mechanizmy existujú na narušenie práce časti projektu?
sobes.tech AI
Odpoveď od AI
-
Výnimky (Exceptions): Umožňujú zastaviť vykonávanie kódu pri vzniku chyby a preniesť riadenie na bloky
begin/rescue/ensure.begin # Kód, ktorý môže spôsobiť chybu result = 1 / 0 rescue ZeroDivisionError => e # Spracovanie špecifickej chyby puts "Chyba delenia nulou: #{e.message}" # Možné logovanie alebo alternatívne vykonanie rescue StandardError => e # Spracovanie iných štandardných chýb puts "Nastala iná chyba: #{e.message}" ensure # Kód, ktorý sa vykoná vždy, bez ohľadu na prítomnosť chyby puts "Ukončenie bloku" end -
Raise: Jasné vyvolanie výnimky, ako pre štandardné, tak aj pre používateľské triedy chýb.
# Obvyklé vyvolanie výnimky raise "Niečo sa pokazilo" # Vyvolanie s konkrétnym triedou chyby raise MyCustomError, "Neplatná hodnota" -
exit,abort,Kernel#exit!: Metódy na ukončenie vykonávania programu.exit!ukončí program okamžite, bez volania handlerovat_exit.# Obvyklé ukončenie programu exit(0) # 0 - úspešné ukončenie # Ukončenie s chybou abort("Ukončenie kvôli kritickej chybe") # Vynútené ukončenie Kernel.exit!(1) -
Thread#raise: Umožňuje vyvolať výnimku v inom vlákne.
thread = Thread.new do begin loop { sleep 1 } rescue => e puts "Vlakno zachytené: #{e.class}" end end sleep 2 thread.raise StandardError, "Zastavenie vlákna" thread.join -
Programové chyby (logické, syntaktické): Nesprávne napísaný kód môže viesť k zlyhaniu vykonávania.
# Syntaktická chyba (chýba end) def my_method puts "Ahoj" # Logická chyba (nekonečná slučka) while true puts "Slučka" end -
Signály operačného systému (SIGTERM, SIGINT a pod.): Môžu prerušiť vykonávanie programu zvonku.
# Jednoduchý príklad spracovania signálu SIGINT (Ctrl+C) Signal.trap("INT") { puts "\nZachytený SIGINT. Ukončujem..."; exit } loop { sleep 1 } -
Assertions (najmä pri vývoji a testovaní): Mechanizmy kontroly podmienok, pri ktorých sa vyvolá výnimka alebo vykoná iná akcia. V Ruby sa často realizujú pomocou knižníc na testovanie.
# Príklad s použitím knižnice MiniTest require 'minitest/autorun' class MyTest < Minitest::Test def test_delenie # Tvrdenie: výsledok delenia 4 na 2 je 2 assert_equal 2, 4 / 2 # Tvrdenie: delenie nulou by malo vyvolať výnimku ZeroDivisionError assert_raises(ZeroDivisionError) { 1 / 0 } end end