2

Ruby on Rails 3.2.2を使用していますが、「カスタム」エラーメッセージを表示して、次のプロセスフローを適切にレスキューしたいと思います。

def rescue_method
  # sample_string.class
  # => String
  # sample_string.inspect
  # => "ARubyConstantThatDoesNotExist"

  begin
    build_constant(sample_string)
  rescue
    raise("My custom error message: #{build_constant(sample_string)} doesn't exist.")
  end
end

def build_constant(sample_string)
  "AModule::#{sample_string}".constantize
end

:コードをDRYconstantizeするために、発生した「カスタム」メッセージでもこのメソッドを使用することを「強制」されていると感じます。

rescue_methodを実行すると、コードが実行されなかったようで、raise("My custom error message")次のエラーが発生します。

uninitialized constant AModule::ARubyConstantThatDoesNotExist

発生した「カスタム」メッセージを適切に表示するにはどうすればよいですか(後続の発生した「カスタム」メッセージでさらにエラー例外が発生するため)。何についてアドバイスしますか?

4

3 に答える 3

9

問題は、build_constantメソッドが2つのことを実行していることです。

  1. クラス名を作成します。
  2. を使用して名前をクラスに変換しconstantizeます。

それらの1つは、例外が発生したときにもう1つを使用したいと考えています。簡単な解決策は、これらの個別のタスクを引き離すことです。

def build_class_name(sample_string)
  "AModule::#{sample_string}"
end

def rescue_method
  name = build_class_name(...)
  name.constantize
rescue NameError
  raise("My custom error message: #{name} doesn't exist.")
end

また、探している例外についてより具体的にする必要があるので、無料で追加しました。

于 2012-09-19T02:11:08.090 に答える
7

例外のキャッチに依存したくない場合は、safe_constantizehttps://apidock.com/rails/ActiveSupport/Inflector/safe_constantize)を使用できます。

モジュールが存在しない場合は常に、と同じ目的constantizeですが、代わりに戻ります。nil

'UnknownModule::Foo::Bar'.safe_constantize  # => nil
于 2017-05-29T15:54:32.027 に答える
0
begin
  "AModule::#{sample_string}".constantize
rescue SyntaxError, NameError => err
  raise("My custom error message")
end
于 2012-09-19T01:41:31.257 に答える