在Ruby中,`rescue`语句可以嵌套在哪些结构中

Joh*_*ler 33 ruby syntax error-handling

在ruby中捕获错误,使用该rescue语句.通常这种说法发生在begin和之间end.也可以使用rescue语句作为block(do ... end)或方法(def ... end)的一部分.我的问题是什么其他结构(循环,而如果,......),如果有任何将拯救巢内?

klo*_*ner 44

您只能在两种情况下使用救援:

函数,模块和类体(感谢Jörg)是隐式begin...end块,因此您可以在没有显式begin/的任何函数内进行挽救end.

    def foo
      raise
    rescue
      nil
    end
Run Code Online (Sandbox Code Playgroud)

块形式采用可选的参数列表,指定哪些异常(和后代)rescue:

    begin
      eval string
    rescue SyntaxError, NameError => boom
      print "String doesn't compile: " + boom
    rescue StandardError => bang
      print "Error running script: " + bang
    end
Run Code Online (Sandbox Code Playgroud)

如果将内联作为语句修饰符调用,或者在begin/ endblock中没有参数,则rescue将捕获StandardError及其后代.

这是关于的1.9文档rescue.

  • @john - do ... end不是一个隐含的开始...结束. (7认同)
  • `module`和`class`主体也是隐含的`begin`块. (4认同)
  • 尽管没有很好的文档记录,但从 ruby​​ 2.5 开始,“rescue”在常规的“do”/“end”块中工作(尽管不是内联块“{...}”)。[提交](https://github.com/ruby/ruby/commit/0ec889d7ed) (4认同)
  • @JörgW Mittag:`do ... end`块和`def ... end`方法定义一样。还有其他隐式的“开始”吗?例如“ while”,“ case”或“ if”? (3认同)

pim*_*pin 11

正如最近的评论中所说,自 Ruby 2.5 以来,响应已经发生了变化。

do ... end块现在是隐式begin ... end块;如模块、类和方法体。

内联块{...}仍然不能。