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! прекратява програмата незабавно, без извикване на обработчиците at_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 (Ctrl+C)
    Signal.trap("INT") { puts "\nЗасечен SIGINT. Завършване..."; exit }
    
    loop { sleep 1 }
    
  • Assertions (особено при разработка и тестове): Механизми за проверка на условия, при нарушаването на които се изхвърля изключение или се изпълнява друго действие. В Ruby често се реализират с помощта на тестови библиотеки.

    # Пример с използване на библиотеката 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