Sobes.tech
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/ensure blokiem:

    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