Назад к вопросам
Middle+
137
questionbank

Какие механизмы существуют для нарушения работы отдельной части проекта?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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 "Hello"
    
    # Логическая ошибка (бесконечный цикл)
    while true
      puts "Loop"
    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