1

考虑以下两种引发异常的方法 -

class ExampleError < StandardError; end

raise ExampleError.new

raise ExampleError

在第一种方式中,为ExampleError方法提供了一个实例raise。该raise方法可以接受一个Exception参数,一切都很清楚。

在第二种方式Class中,为该方法提供了一个实例,但这仍然有效。

raise由于可以接受的事实String,是否有参数从Class到的隐式转换String

谢谢

4

1 回答 1

4

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

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

因此,您可以将任何内容传递给raise,只要它是字符串或具有exception方法。您的两个变体都通过这里:

class ExampleError < StandardError; end

ExampleError.exception # => #<ExampleError: ExampleError>
ExampleError.new.exception # => #<ExampleError: ExampleError>
于 2013-03-20T17:41:32.507 回答