【问题标题】:Customize Exception Message for a Integer convertion - Ruby为整数转换自定义异常消息 - Ruby
【发布时间】:2017-08-12 10:14:16
【问题描述】:

我正在尝试做一个 safe_Int(n)。

如果输入不是“整数”值(例如:123 或 '123'),它应该返回 TypeError 和消息:“#{n} must be a number”。

这是我所做的:

def safe_Int(n)
 begin
  Integer(n) rescue TypeError
 rescue TypeError => e
  puts "#{n} is not a number" 
 end 
end

我无法显示我想要的消息。

我得到“没有将类隐式转换为整数”

如何自定义错误信息?

【问题讨论】:

  • 这可能是个坏主意。 .to_i 是一种安全的转换方式,它几乎适用于任何可以将自身强制转换为整数的东西。像这样的硬铸造是一种相当严厉的方法。同样,将异常转换为随机输出并没有真正的帮助,它只是忽略了可能是严重的问题。
  • .to_i 不适合我的需求...我还需要为布尔值获取相同的消息。

标签: ruby exception error-handling


【解决方案1】:

好的!找到了我要找的东西:

def safe_Int(n)
Integer(n)
rescue
  raise TypeError.new "#{n} is not a number!"
end

obs:我没有展示完整的代码,所以我不会成为挑战的破坏者。

【讨论】:

  • 这确实违反了很多 Ruby 约定,方法名称应该全小写,但如果这是您的目标,您需要做的就是:raise TypeError, "..." 其中new 不是明确必需的。第二个参数会自动转发给你的构造函数。
  • 干得好!!感谢您发现这一点!我会更加注意并保持全小写!咳咳!
【解决方案2】:

并不是说我认为这是一个好主意,而是 Integer(n) 提出了 ArgumentError 而不是 TypeError 所以你的代码应该是这样的:

def safe_int(n)
  Integer(n)
rescue ArgumentError => e
  puts "#{n} is not a number"
end

【讨论】:

  • 你可能是对的,也可能不是:D.. 这是 Matz 的一次讨论 link 是 TypeError 是 ArgumentError 的子类吗?但我真的需要它作为 TypeError,显示该消息...
  • 我只知道Integer('a') 给了我一个ArgumentError :) 你的代码有点混乱你能解释一下你想要做什么吗?
  • 当然很混乱!我在学习!哈哈!! :D 我正试图在 codewars.com 上提出挑战。我想出了如何去做......在我看到“最佳实践”解决方案之后!嘿,这真的很容易! Integer(n) rescue raise TypeError.new "#{n} is invalid"
猜你喜欢
  • 2015-11-04
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
相关资源
最近更新 更多