Middle+
Kādi mehānismi pastāv, lai traucētu projekta atsevišķas daļas darbu?
sobes.tech AI
Atbilde no AI
-
Izņēmumi (Exceptions): Atļauj pārtraukt koda izpildi, ja rodas kļūda, un nodot kontroli
begin/rescue/ensureblokiem:begin # Kods, kas var izraisīt kļūdu result = 1 / 0 rescue ZeroDivisionError => e # Konkrētas kļūdas apstrāde puts "Dalīšana ar nulli kļūda: #{e.message}" # Iespējams, reģistrēšana vai alternatīva izpilde rescue StandardError => e # Citu standarta kļūdu apstrāde puts "Notika cita kļūda: #{e.message}" ensure # Kods, kas vienmēr tiek izpildīts, neatkarīgi no kļūdas puts "Bloka beigas" end -
Raise: Skaidrs izņēmuma izsaukums, gan standarta, gan lietotāja definētām kļūdām:
# Parasts izsaukums raise "Kas notika nepareizi" # Ar konkrētu kļūdas klasi raise MyCustomError, "Nederīga vērtība" -
exit,abort,Kernel#exit!: Programmas beigu metodes:# Parasts programmas beigas exit(0) # 0 - veiksmīgs beigas # Ar kļūdu abort("Beigas sakarā ar kritisku kļūdu") # Spiediena beigas Kernel.exit!(1) -
Thread#raise: Atļauj izsaukt izņēmumu citā pavedienā:
thread = Thread.new do begin loop { sleep 1 } rescue => e puts "Pavediena notverts: #{e.class}" end end sleep 2 thread.raise StandardError, "Pavediena apturēšana" thread.join -
Programmas kļūdas (loģiskās, sintaktiskās): Nepareizi uzrakstīts kods var novest pie avārijas:
# Sintaktiska kļūda (trūkst end) def my_method puts "Sveiki" # Loģiskā kļūda (bezgalīga cilpa) while true puts "Cilpa" end -
Operētājsistēmas signāli (SIGTERM, SIGINT un citi): Var pārtraukt programmas izpildi ārpus tās:
# Vienkāršs SIGINT (Ctrl+C) apstrādes piemērs Signal.trap("INT") { puts "\nSIGINT saņemts. Beidzu..."; exit } loop { sleep 1 } -
Apstiprinājumi (Assertions) — īpaši izstrādes un testēšanas laikā: Kontroles mehānismi, kas, pārkāpjot nosacījumus, izmet izņēmumu:
# Piemērs ar MiniTest bibliotēku require 'minitest/autorun' class MyTest < Minitest::Test def test_dalīšanu # Apstiprinājums: 4 dalīts ar 2 ir 2 assert_equal 2, 4 / 2 # Apstiprinājums: dalīšana ar nulli izraisīs ZeroDivisionError assert_raises(ZeroDivisionError) { 1 / 0 } end end