快速查询: Java程序员将如何理解以下Ruby语句:
rescue ErrorType1, ErrorType2 => ex
也就是说,我想明确地在它周围加上括号/括号。 那么,是吗?
rescue(ErrorType1, {ErrorType2 => ex})
或,
rescue({[ErrorType1, ErrorType2] => ex})
或者别的......
答案 0 :(得分:4)
关于语法:
rescue ErrorType1, ErrorType2 => ex
请注意以下事项:
现在,再看一下语法......
答案 1 :(得分:2)
rescue
是一个控制结构,它有自己的语法,它不是方法调用,所以你的第二和第三个代码块是无效的语法,你不会传递任何参数。
rescue <exception-class1>[, <exception-class2>] => <a variable to assign the exception to>
因此,在执行rescue TypeError, StandardError => my_exception
时,它会捕获引发的任何TypeError
或StandardError
异常,并将其分配给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