我正在运行一个经常超时的API脚本。发生这种情况时,我使用begin/rescue
块将其发送到redo
,但我希望在运行redo
命令之前将发生的情况记录到命令行。
begin
#...api query...
rescue ErrorClass
puts("retrying #{id}") && redo
end
不幸的是,上面的脚本不起作用。仅运行第一个命令。
我想强制rescue块运行多行代码,如下所示:
begin
# api query
rescue ErrorClass do ###or:# rescue ErrorClass do |e|
puts "retrying #{id}"
redo
end
但那些也不管用
我有幸创建了一个独立的方法来运行:
def example
id = 34314
begin
5/0
rescue ZeroDivisionError
eval(handle_zerodiv_error(id))
end
end
def handle_zerodiv_error(id)
puts "retrying #{id}"
"redo"
end
...这真的管用但是在我看来,它需要太多的代码行,而且它使用了eval,根据我的导师的说法,这是不正确的。
2条答案
按热度按时间eh57zj3b1#
使用
&&
或do
会不必要地使事情复杂化。&&
版本不起作用,因为puts
返回nil
,所以通过&&
的快捷方式计算,不计算后面的部分。如果您使用||
或;
,那么它将工作:但这也不是必须的。您似乎认为需要
rescue
中的一个块来写入多行,但这是没有意义的,因为您没有使用一个只有一行的块。没有一种Ruby构造只在有多行时才需要一个块。所以,把它们放在多行中:5w9g7ksd2#
有一个
retry
内置。这个例子来自“Ruby编程语言”第162页。