Sobes.tech
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