考虑以下两种方式来引发异常 -
class ExampleError < StandardError; end
raise ExampleError.new
raise ExampleError
在第一种方式中,ExampleError
的实例被赋予方法raise
。 raise
方法可以接受Exception
参数,一切都很清楚。
在第二种方式中,Class
实例被赋予该方法,但这仍然有效。
由于raise
可以接受String
这一事实,是否将参数从Class
隐式转换为String
?
谢谢
答案 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>