【问题标题】:How can I make this ruby code throw an exception and bail?我怎样才能让这个红宝石代码抛出异常并保释?
【发布时间】:2012-10-26 21:51:30
【问题描述】:

我希望它抛出异常并死掉:

begin
  if meridian != "AM" and meridian != "PM"
    rescue
    puts MESSAGE
  end
end   

我用谷歌搜索了很多,但似乎没有任何效果。我希望if 语句在失败时抛出异常。

我看错了吗?

【问题讨论】:

  • 现在使用“AND”和“AN”很糟糕
  • 在 ruby​​ 中,您通过调用 raise 来抛出异常。您可以查看此内容以了解更多信息:rubylearning.com/satishtalim/ruby_exceptions.html
  • 那段代码已经“死”了——它是无效的语法 :) expr if condif cond [then] expr 是有效的形式。

标签: ruby exception


【解决方案1】:

试试这个:

raise "message" unless ["AM", "PM"].include? meridian

【讨论】:

  • 更简洁的语法:%w(AM PM).include? meridian
  • 如果您希望它是不区分大小写的匹配,请将其设为 meridian.upcase
【解决方案2】:

你也可以使用正则表达式:

raise 'message' unless meridian =~ /\A(a|p)m\z/i

这与大小写无关,也适用于符号。

【讨论】:

    【解决方案3】:

    恕我直言,您应该使用 fail 而不是 raise,因为可读性很重要,请参阅下面的链接。

    fail "message" unless ["AM", "PM"].include? meridian
    

    https://github.com/bbatsov/ruby-style-guide#exceptions

    【讨论】:

    • fail 只是 raise 的别名,但从语义上讲,你说得很好。
    【解决方案4】:

    您不需要begin/rescue,因为您的if 语句没有遇到任何错误。而是:

     raise "message" if meridian != "AM" and meridian != "PM"
    

    【讨论】:

      【解决方案5】:

      要么删除 if 周围的 begin/rescue/end,要么将 puts MESSAGE 替换为 raise "some_message_here"

      【讨论】:

        【解决方案6】:

        成功了

              MESSAGE = "Check your formatting"
              if meridian != "AM" and  meridian  != "PM"
                  abort( MESSAGE )
              end  
        

        【讨论】:

          猜你喜欢
          • 2011-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          • 1970-01-01
          相关资源
          最近更新 更多