我正在运行一个带有经常超时的 API 的脚本。当发生这种情况时,我正在使用begin/rescue
块来获取它redo
,但想在运行redo
命令之前记录命令行中发生的事情。
begin
#...api query...
rescue ErrorClass
puts("retrying #{id}") && redo
end
不幸的是,上面的脚本不起作用。只运行第一个命令。
我想强制救援块运行多行代码,如下所示:
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,根据我的导师的说法,它无论如何都不是 kosher。