理解语句“rescue ErrorType1,ErrorType2 => ex”的语法

时间:2013-10-05 10:36:05

标签: ruby

快速查询: Java程序员将如何理解以下Ruby语句:

rescue ErrorType1, ErrorType2 => ex

也就是说,我想明确地在它周围加上括号/括号。 那么,是吗?

rescue(ErrorType1, {ErrorType2 => ex})

或,

rescue({[ErrorType1, ErrorType2] => ex})

或者别的......

3 个答案:

答案 0 :(得分:4)

关于语法:

rescue ErrorType1, ErrorType2 => ex

请注意以下事项:

  1. 没有涉及哈希
  2. 'rescue'不是一种方法,你甚至不能把它写成救援(ErrorType1,ErrorType2 => ex)
  3. Ruby将对引发的关联异常的引用放入 全局变量$!。
  4. 在上面的表格中,'rescue'采用特殊参数 你给出一个局部变量的名称来接收匹配的 异常,使用$!。
  5. 更易读

    现在,再看一下语法......

答案 1 :(得分:2)

rescue是一个控制结构,它有自己的语法,它不是方法调用,所以你的第二和第三个代码块是无效的语法,你不会传递任何参数。

rescue <exception-class1>[, <exception-class2>] => <a variable to assign the exception to>

因此,在执行rescue TypeError, StandardError => my_exception时,它会捕获引发的任何TypeErrorStandardError异常,并将其分配给my_exception局部变量。

我建议最近翻译Ruby Hacking Guide(搜索“救援”)。

答案 2 :(得分:1)

请看以下代码:

begin
    a=1/0
rescue => e
    p e.class
    p defined?(e)
end
# >> ZeroDivisionError
# >> "local-variable"

其中e是该异常处理块的局部变量。在Ruby中,局部变量是使用赋值操作创建的,但是在异常处理的情况下,使用散列火箭(=>)而不是=将对当前引发的异常的引用分配给局部变量e。这是按照设计。不要以为它是哈希

在Ruby中,我们使用一个或多个rescue子句来告诉Ruby我们想要处理的异常类型。如果编写一个没有参数列表的rescue子句,则参数默认为StandardError。每个rescue子句都可以指定要捕获的多个异常。在每个rescue子句的末尾,您可以为Ruby提供局部变量的名称以接收匹配的异常。 rescue子句的参数也可以是返回Exception类的任意表达式(包括方法调用)。如果我们使用不带参数的raise,则会重新引发异常。Handling an Exception

在您的三个代码中,只有rescue ErrorType1, ErrorType2 => ex有效。其他人会给你语法错误。

层次结构(部分):

StandardError
   |
  IndexError
      |
     KeyError

您可以按任何顺序将错误类名称指定为rescue列表的参数。运行时ruby将从列表中选择正确的名称。看下面的代码:

begin
    a = {}
    a.fetch(:b)
rescue StandardError,KeyError,IndexError => e
    p e.class
end
# >> KeyError

begin
    a = {}
    a.fetch(:b)
rescue KeyError,StandardError,IndexError => e
    p e.class
end
# >> KeyError

如果你认为,你会在运行时告诉Ruby解释器,首先使用参数列表中的 paren 匹配哪一个,Ruby 将不允许 你这样做,作为回报它会抛出你的语法错误。同样如下:

begin
    a = {}
    a.fetch(:b)
rescue StandardError => e1
    p e1.class
rescue IndexError => e2
    p e2.class
rescue KeyError => e3
    p e3.class
end
# >> KeyError

注意:如果我们想要捕获更多异常类,我们可以直接编写它们。当我们想要以不同方式处理不同的错误时,我们可以指定多个rescue子句。Ruby Hacking Guide