Пытаюсь разобраться с темой исключений в 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. Объясните пожалуйста, как заставить его там работать или хотя бы почему он там не работает?