【问题标题】:Catch-all rescue包罗万象的救援
【发布时间】:2012-11-24 21:44:06
【问题描述】:

在 Ruby/Rails 中,是否有一个“包罗万象”的rescue 语句也允许更具体的rescue 可能性?我试过了

begin
  # something
rescue URI::InvalidURIError
  # do something
rescue SocketError
  # do something else
rescue 
  # do yet another thing
end

事实证明,即使存在URI::InvalidURIErrorSocketError,它也会进入最后一个rescue(即它执行do yet another thing。)我希望它分别为do somethingdo something else

【问题讨论】:

  • 首先,我怀疑当 URI::InvalidURIErrorSocketError 被提出时,它会进入最后一个 rescue——这不是 Ruby 的工作方式。其次,您想要获得其他所有内容但具体的东西?不确定这是否具有语义意义,因为根据定义,包罗万象是不具体的。
  • 我想也许他的意思是他需要一个解决方案来进行更具体的救援,因为他认为正确的方法是行不通的。也许真正发生的事情是在您期望的错误之前在块中抛出了一个不同的错误。您可能应该检查在最后一次救援中实际遇到的错误,看看发生了什么。
  • @numbers1311407 感谢您的建议。我如何检查我在上次救援中发现的错误?
  • Rails.logger.error(!$) 或将救援更改为rescue => e,然后更改为Rails.logger.error(e)。它会显示在您的日志中。或者,继续加注,这样它就不会被区块中的raise $! 抓住。
  • @AndrewMarshall 和 numbers1311407 你是对的。我误解了一些东西。谢谢大家!

标签: ruby rescue


【解决方案1】:
require 'uri'
require 'socket'

Errors = [URI::InvalidURIError, SocketError]
a = lambda { |e=nil|
             begin
               raise e unless e.nil? 
             rescue URI::InvalidURIError
               puts "alligator"
             rescue SocketError
               puts "crocodile"
             rescue
               puts "vulture"
             else
               puts "rhino"
             end }

现在试试

a.( Errors[ 0 ] )
a.( Errors[ 1 ] )
a.call

它将完全按照您的需要运行。如果您上面的代码不起作用,那么您的程序中发生的事情超出了您的想象。

【讨论】:

    猜你喜欢
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2011-02-12
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多