Ruby raise方法和隐式强制

时间:2013-03-20 17:37:24

标签: ruby

考虑以下两种方式来引发异常 -

class ExampleError < StandardError; end

raise ExampleError.new

raise ExampleError

在第一种方式中,ExampleError的实例被赋予方法raiseraise方法可以接受Exception参数,一切都很清楚。

在第二种方式中,Class实例被赋予该方法,但这仍然有效。

由于raise可以接受String这一事实,是否将参数从Class隐式转换为String

谢谢

1 个答案:

答案 0 :(得分:4)

不,它不会转换为String。事实上,你的假设是错误的。 raise不需要某个异常类的实例。它宁愿拥有异常类本身。请参阅Kernel#raise的文档:

  

...使用单个String参数,将字符串作为消息引发RuntimeError。否则,第一个参数应该是Exception类的名称(或者在发送异常消息时返回Exception对象的对象)。 ...

因此,您可以将任何内容传递给raise,只要它是字符串或exception方法即可。你的变种都传到这里:

class ExampleError < StandardError; end

ExampleError.exception # => #<ExampleError: ExampleError>
ExampleError.new.exception # => #<ExampleError: ExampleError>