Задать вопрос
@BestDirectolog

Как перехватить исключение в блоке инициализации?

Пытаюсь разобраться с темой исключений в ruby и как-то не могу найти внятного ответа на свою проблему: не получается сделать так, чтобы отсутствие аргументов при создании класса Train перехватывалось и обрабатывалось командой rescue в методе initialize.

class Train

  attr_reader :speed, :wagons, :train_type, :train_rout, :current_station, :name

  NAMEPATTERN = /[а-яА-Яa-zA-Z0-9]{3}-?[а-яА-Яa-zA-Z0-9]{2}/

  def initialize(wagons, train_type, name)
    @wagons = wagons
    @train_type = train_type
    @name = name
    valid? #подключаем метод который должен обработать отсутствие аргументов
    initialize_super # подключаем метод из счетчика instance_counter подсчитывающий экземпляры класса
    @speed = 0
    puts "\nTrain created! It's #{@train_type} train, with #{@wagons} wagons, with name #{@name}." 
    
  end

  def valid! # метод отвечающий за выброс ошибок
      raise ArgumentError, 'Wagon is nil' if wagons.nil? # в случае отсутствия аргумента выбрасываем ошибку, именно эти три помеченные ArgumentError не выбрасываются
      raise ArgumentError, 'Train_type is nil' if train_type.nil?
      raise ArgumentError, 'name is nil' if name.nil?
      raise RuntimeError, 'Wrong train name' if name !~ NAMEPATTERN
    true
  end

  def valid?
    valid!
  rescue RuntimeError
    puts "\nWrong train name."
    false
  rescue ArgumentError
    puts "\nTrain does not created! No arguments."
    false
  end
end

puts "Тестируем без ошибок"
train7 = Train.new(13, "Passenger's", '888-88')

puts "Тестируем с ошибкой"
#begin
train8 = Train.new(44)
#rescue ArgumentError
#puts "\nTrain does not created! No arguments."
#end

В данном виде, ruby (2.0 и 2.3) выкидывает ошибку ArgumentError, но не обрабатывает по сценарию rescue.
Если в последнем тесте с ошибкой, где один аргумент вместо трех активировать закомментированный код, то исключение обработается, но этот вариант мне не интересен. Если аналогичный код прописать в методе initialize, то он не будет обрабатывать ArgumentError. Объясните пожалуйста, как заставить его там работать или хотя бы почему он там не работает?
  • Вопрос задан
  • 172 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
c3gdlk
@c3gdlk
Ментор в http://rubyboost.ru/
он там не работает, потому что руби не заходит внутрь. У вас не совпадает количество аргументов. Можно сделать что-то типа такого

def initialize(*args)
  if args.size == 3
     wagons, train_type, name = args
     #main logic here
  else
     #handle error
  end
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы