代码之家  ›  专栏  ›  技术社区  ›  Blake

为什么ruby将我的扩展标准错误包装为参数错误?

  •  0
  • Blake  · 技术社区  · 10 年前

    这个看似简单的代码片段表现得惊人:

    class Nex < StandardError
    end
    
    throw Nex.new
    

    回报 ArgumentError: uncaught throw #<Nex: Nex>

    好吧,也许我得试试/抓住:

    begin
      throw Nex.new
    rescue Nex
    end
    

    return `ArgumentError:未捕获抛出#

    挽救ArgumentError怎么样?

    begin
      throw Nex.new
    rescue ArgumentError => e
      puts e
    end
    

    回报 uncaught throw #<Nex: Nex> =>无

    这是怎么回事?我希望 接住 Nex!扩展标准错误会变成ArgumentError,这是毫无意义的,因为ArgumentError也扩展了StandardError。

    2 回复  |  直到 10 年前
        1
  •  2
  •   the Tin Man    10 年前

    在Ruby中 rescue 用于抢救异常(因此不应用于流控制)。 营救 与配对 raise (及其同义词 fail ).

    另一方面(如果您来自Java、C++或任何其他使用throw表示“传播此异常”的语言,则会感到困惑),在Ruby中 throw 与配对 catch 并且是流量控制机构。

    它们表面相似, 在调用堆栈中查找匹配项 接住 。你扔/抓的东西通常是一个符号,但它可以是一个任意的对象。如果没有匹配 接住 然后你会得到 ArgumentError .

    / 接住 比引发异常更快,因为通常不需要构造回溯。

        2
  •  1
  •   the Tin Man    10 年前

    因为在Ruby中有关键字 raise fail ,可以满足您的需要。

    throw Kernel 模块,工作方式不同。检查文档。