gpt4 book ai didi

ruby rescue block——响应不止一个命令

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:56 26 4
gpt4 key购买 nike

我正在使用经常超时的 API 运行脚本。当发生这种情况时,我正在使用 begin/rescue block 让它进入 redo,但我想在运行 redo 之前记录命令行发生的事情 命令。

begin
#...api query...
rescue ErrorClass
puts("retrying #{id}") && redo
end

不幸的是,上面的脚本不起作用。仅运行第一个命令。

我想强制救援 block 运行多行代码,如下所示:

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。

最佳答案

使用 &&do 会使事情不必要地复杂化。 && 版本不起作用,因为 puts 返回 nil,因此通过 && 的快捷评估,接下来的部分不评价。如果您使用 ||; 代替,那么它将起作用:

begin
...
rescue ErrorClass
puts("retrying #{id}") || redo
end

begin
...
rescue ErrorClass
puts("retrying #{id}"); redo
end

但这也不是必须的。您似乎以某种方式相信您需要 rescue 中的 block 来编写多行,但这没有意义,因为您没有使用单行 block 。没有 Ruby 构造只在有多行时才需要一个 block 。所以,只需将它们放在多行中:

begin
...
rescue ErrorClass
puts("retrying #{id}")
redo
end

关于ruby rescue block——响应不止一个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21649122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com