Создание сообщения об ошибке для неверного ввода - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий код, который возвращает количество дней в любом конкретном месяце, который работает нормально, если кто-то не введет что-то, что не является датой, или они неправильно форматируют дату. Чтобы исправить это, я хочу отправить сообщение об ошибке для неверного ввода, но я не знаю, как. Так как же создать сообщение об ошибке для этого небольшого приложения?

   #type in the month and year you want like so ---> "Feb 2034"

require 'date'

input = gets.chomp

inputArray = input.split(" ").to_a

textMonth = inputArray[0]
textYear = inputArray[1]

startOfMonth = Date.strptime(input, "%b %Y")
nextMonth = startOfMonth.next_month
endOfMonth = nextMonth - 1
daysInMonth = (endOfMonth - startOfMonth + 1).to_i

puts "#{textMonth} of year #{textYear} has #{daysInMonth} days!"

Ответы [ 3 ]

0 голосов
/ 17 мая 2018

Для создания пользовательской ошибки см. Код ниже: Здесь я создаю и поднимаю InvalidDateError для неправильного ввода даты.

   #type in the month and year you want like so ---> "Feb 2034"
class InvalidDateError < StandardError
end

require 'date'
require 'pry-byebug'
input = gets.chomp

inputArray = input.split(" ").to_a

textMonth = inputArray[0] 
textYear = inputArray[1]
begin
    startOfMonth = Date.strptime(input, "%b %Y")
    nextMonth = startOfMonth.next_month
    endOfMonth = nextMonth - 1
    daysInMonth = (endOfMonth - startOfMonth + 1).to_i
    puts "#{textMonth} of year #{textYear} has #{daysInMonth} days!"
rescue StandardError=> e
    raise InvalidDateError.new("Invalid Date : #{input}")
end

Если вы не хотите выдавать ошибку и хотите только показатьзатем сообщение об ошибке замените raise InvalidDateError.new("Invalid Date : #{input}") на puts "Invalid Date : #{input}"

0 голосов
/ 17 мая 2018

По предположению Виктора и украдено :) из crantok

require 'date'
date_valid = false

while !date_valid
  puts 'Insert date as yyyy-mm-dd:'
  input_date = gets.chomp

  begin
    parsed_date = Date.parse(input_date)
    date_valid = true
  rescue ArgumentError
    puts 'format error'
  end
end

month = parsed_date.month
year = parsed_date.year
days_in_month = Date.new(year, month, -1).day
puts "In #{year} month #{month} has #{days_in_month} days"
0 голосов
/ 16 мая 2018

Вероятно, лучший способ сделать это - поместить ваш ввод в цикл while, запрашивая новый ответ каждый раз, когда ввод не соответствует ожидаемому.

Для проверки ввода вы должны использовать Regexp . Вот объяснение как написать регулярное выражение для соответствия дате.

...