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)
如何正确显示引发的"自定义"消息(因为在后续引发的"自定义"消息中引发了进一步的错误异常)?你有什么建议?
问题是你的build_constant方法做了两件事:
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).
目的与目的相同,constantize但nil只要模块不存在,就会返回.
'UnknownModule::Foo::Bar'.safe_constantize # => nil
Run Code Online (Sandbox Code Playgroud)