Middle+
Ի՞նչ մեխանիզմներ կան նախագծի առանձին մասի աշխատանքը խանգարելու համար։
sobes.tech AI
Պատասխան AI-ից
-
Հատկություններ (Exceptions): Դրանք թույլ են տալիս կանգնեցնել կոդի կատարմանը սխալի առաջացման դեպքում և փոխանցել կառավարումը
begin/rescue/ensureբլոկներին:begin # Կոդ, որը կարող է սխալ առաջացնել result = 1 / 0 rescue ZeroDivisionError => e # Սխալի մշակումը puts "Բաժանման սխալը զրոյով՝ #{e.message}" # Հնարավոր է, գրանցում կամ այլընտրանքային կատարմամբ rescue StandardError => e # Այլ ստանդարտ սխալների մշակումը puts "Այլ սխալ է տեղի ունեցել՝ #{e.message}" ensure # Կոդ, որը միշտ կատարվում է, անկախ սխալի առկայությունից puts "Բլոկի ավարտ" end -
Raise: Մասնակի հստակեցում սխալի առաջացման՝ ինչպես ստանդարտ, այնպես էլ օգտագործողի սահմանած սխալների համար:
# Սովորական սխալի առաջացում raise "Ինչ-որ բան սխալ է եղել" # Սխալի առաջացում կոնկրետ դասով raise MyCustomError, "Անթույլատրելի արժեք" -
exit,abort,Kernel#exit!: Կառավարիչներ ծրագրի ավարտման համար:# Սովորական ծրագրի ավարտում exit(0) # 0 - հաջող ավարտ # Սխալի դեպքում ավարտում abort("Կատարվում է սխալի պատճառով") # Զանգվածային ավարտ Kernel.exit!(1) -
Thread#raise: Հնարավորություն է տալիս հրահրել սխալ մեկ այլ թելում:
thread = Thread.new do begin loop { sleep 1 } rescue => e puts "Թելն է բռնվել՝ #{e.class}" end end sleep 2 thread.raise StandardError, "Թելն է կանգնեցվել" thread.join -
Ծրագրային սխալներ (գործնական, սինտաքսիկ): Անհաջող կոդը կարող է հանգեցնել սխալների:
# Սինտաքսիկ սխալ (չի կա end) def my_method puts "Բարև" # Գործնական սխալ (անվերջական ցիկլ) while true puts "Ցիկլ" end -
Օպերացիոն համակարգի ազդանշաններ (SIGTERM, SIGINT և այլն): Դրանք կարող են խզել ծրագրի կատարմանը:
# Պարզ օրինակ SIGINT ազդանշանի մշակման Signal.trap("INT") { puts "\nՀասցվեց SIGINT. Կատարվում է ավարտը..."; exit } loop { sleep 1 } -
Հաստատումներ (Assertions)՝ հատկապես զարգացման և թեստավորման ժամանակ:
# Օրինակ MiniTest գրադարանի օգտագործմամբ require 'minitest/autorun' class MyTest < Minitest::Test def test_division # Հաստատում՝ 4-ի բաժանում 2-ի վրա հավասար է 2 assert_equal 2, 4 / 2 # Հաստատում՝ բաժանում զրոյով պետք է առաջացնի ZeroDivisionError assert_raises(ZeroDivisionError) { 1 / 0 } end end