如何解决`constantize`方法引发的错误异常?

use*_*882 1 ruby ruby-on-rails exception rescue ruby-on-rails-3

我正在使用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
Run Code Online (Sandbox Code Playgroud)

注意:我觉得"强制" constantize在引发的"自定义"消息中也使用该方法以便干掉代码...

rescue_method执行时,似乎raise("My custom error message")代码永远不会执行,我收到以下错误:

uninitialized constant AModule::ARubyConstantThatDoesNotExist
Run Code Online (Sandbox Code Playgroud)

如何正确显示引发的"自定义"消息(因为在后续引发的"自定义"消息中引发了进一步的错误异常)?你有什么建议?

mu *_*ort 7

问题是你的build_constant方法做了两件事:

  1. 构建类名.
  2. 使用将名称转换为类constantize.

当引发异常时,其中一件事想要使用另一件事.一个简单的解决方案是将这些单独的任务分开:

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
Run Code Online (Sandbox Code Playgroud)

您还应该更加具体地了解您正在寻找的异常,因此我免费添加了该异常.


小智 6

如果您不想依赖捕获任何异常,可以使用safe_constantize(https://apidock.com/rails/ActiveSupport/Inflector/safe_constantize).

目的与目的相同,constantizenil只要模块不存在,就会返回.

'UnknownModule::Foo::Bar'.safe_constantize  # => nil
Run Code Online (Sandbox Code Playgroud)