1

例外を発生させるには、次の2つの方法を検討してください-

class ExampleError < StandardError; end

raise ExampleError.new

raise ExampleError

最初の方法では、のインスタンスがExampleErrorメソッドに与えられますraise。メソッドはパラメーターをraise受け入れることができ、すべてが明確です。Exception

2番目の方法では、Classインスタンスがメソッドに与えられますが、これは引き続き機能します。

raiseを受け入れることができるという事実のために、パラメータのからへStringの暗黙の変換がありましたか?ClassString

ありがとうございました

4

1 に答える 1

4

いいえ、変換されませんString。実際、あなたの仮定は間違っていました。raise一部の例外クラスのインスタンスは必要ありません。むしろ、例外クラス自体が必要です。Kernel#raiseのドキュメントを参照してください:

... 単一の文字列引数を指定すると、文字列をメッセージとして RuntimeError が発生します。それ以外の場合、最初のパラメーターは Exception クラス (または例外メッセージが送信されたときに Exception オブジェクトを返すオブジェクト) の名前にする必要があります。...

したがって、文字列であるかメソッドraiseを持っている限り、何でも渡すことができます。exception両方のバリアントがここに渡されます:

class ExampleError < StandardError; end

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