Какви механизми съществуват за нарушаване на работата на отделна част от проекта?
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