如何重试红宝石中发生错误的特定语句

问题描述 投票:-1回答:1

我正在询问用户输入并验证输入,如果验证失败,我正在询问用户输入有效输入...

这就是我的做法


     begin 

          enter_user_first_name
          is_first_name_valid?

          enter_user_last_name
          is_last_name_valid?.

          enter_user_age
          greater_than_eq_18?

          enter_user_gender
          gender_valid?

     rescue => error
        p error
        retry
     else

     end

[我首先输入输入,然后验证,但是我面临的问题是,当一条语句失败时,它会再次开始执行begin块的所有语句,例如,如果用户输入的姓氏不正确,它将开始再次询问名字,而不仅仅是询问姓氏。

我该怎么做?

ruby error-handling try-catch exceptionhandler
1个回答
3
投票

您可以创建一个辅助方法,然后为每个可以重试的块调用它:

def with_retry
  begin
    yield
  rescue => error
    puts error
    retry
  end
end

with_retry do
  enter_user_first_name
  is_first_name_valid?
end

with_retry do
  enter_user_last_name
  is_last_name_valid?
end

with_retry do
  enter_user_age
  greater_than_eq_18?
end

with_retry do
  enter_user_gender
  gender_valid?
end

with send(但是我建议您不要在程序中过多使用send,这可能会使您更难以知道正在发生的事情)]

operations = {
  enter_user_first_name: :is_first_name_valid?,
  enter_user_last_name:  :is_last_name_valid?,
  enter_user_age:        :greater_than_eq_18?,
  enter_user_gender:     :gender_valid?
}

operations_each do |input_fn, validation_fn|
  begin
    send(input_fn)
    send(validation_fn)
  rescue => e
    puts e
    retry
  end
end

结束

© www.soinside.com 2019 - 2024. All rights reserved.