Middle+
Kokie mechanizmai egzistuoja, kad būtų sutrikdytas projekto atskiros dalies darbas?
sobes.tech AI
Atsakymas iš AI
-
Išimtys (Exceptions): Leidžia sustabdyti kodo vykdymą įvykus klaidai ir perduoti valdymą
begin/rescue/ensureblokams:begin # Kodas, kuris gali sukelti klaidą result = 1 / 0 rescue ZeroDivisionError => e # Konkretus klaidos apdorojimas puts "Dalyba iš nulio klaida: #{e.message}" # Galimas žurnalo įrašymas ar alternatyvus vykdymas rescue StandardError => e # Kitų standartinių klaidų apdorojimas puts "Įvyko kita klaida: #{e.message}" ensure # Kodas, kuris visada vykdomas, nepriklausomai nuo klaidos puts "Bloko pabaiga" end -
Raise: Aiškus išimties iškėlimas, tiek standartinių, tiek naudotojo sukurtų klaidų klasėms:
# Įprastas iškėlimas raise "Kažkas nepavyko" # Kėlimas su konkrečia klaidos klase raise MyCustomError, "Netinkama reikšmė" -
exit,abort,Kernel#exit!: Programos užbaigimo metodai:# Įprastas programos užbaigimas exit(0) # 0 - sėkmingas užbaigimas # Baigimas su klaida abort("Užbaigimas dėl kritinės klaidos") # Priverstinis užbaigimas Kernel.exit!(1) -
Thread#raise: Leidžia iškelti išimtį kitame gijoje:
thread = Thread.new do begin loop { sleep 1 } rescue => e puts "Gija pagauta: #{e.class}" end end sleep 2 thread.raise StandardError, "Gijos sustabdymas" thread.join -
Programinės klaidos (loginės, sintaksinės): Netinkamai parašytas kodas gali sukelti klaidų:
# Sintaksinė klaida (trūksta end) def my_method puts "Labas" # Loginė klaida (begalinis ciklas) while true puts "Ciklas" end -
Operacinės sistemos signalai (SIGTERM, SIGINT ir kt.): Gali nutraukti programos vykdymą iš išorės:
# Paprastas SIGINT (Ctrl+C) apdorojimo pavyzdys Signal.trap("INT") { puts "\nSIGINT pagautas. Baigiu..."; exit } loop { sleep 1 } -
Tvirtinimai (Assertions) (ypač kūrimo ir testavimo metu): Patikrinimo mechanizmai, kurie išmeta išimtį arba atlieka kitą veiksmą, jei sąlygos pažeidžiamos:
# Pavyzdys naudojant MiniTest biblioteką require 'minitest/autorun' class MyTest < Minitest::Test def test_dalijimą # Tvirtinimas: 4 padalinta iš 2 yra 2 assert_equal 2, 4 / 2 # Tvirtinimas: dalijimas iš nulio turi išmesti ZeroDivisionError assert_raises(ZeroDivisionError) { 1 / 0 } end end