在 ruby 救援后继续脚本
Continue script after rescue in ruby
我正在使用下面提到的 curl 解析 JSON 输出,
但是,由于 DESCRIPTION #{h["incident_updates"][1]["status"]
,我在解析输出时得到 no method error
。因为 [["incident_updates"][1][status]]
在某些情况下不存在,所以只有 [["incident_updates"][0][status]]
的值可用。
( 但其他迭代包含 [0][status]
[1][status]
)
所以为了避免使用 rescue
方法的错误,但是错误被阻止但是脚本在第一个错误之后没有执行(迭代在第一个错误本身停止,脚本没有继续)。需要 运行 脚本直到迭代完成(即,尽管 [1] [status]
脚本没有值,但应该 运行 为下一个迭代元素带来值,因为下一个元素可能包含 [1] [status]
)
请帮忙解决这个问题。
提前致谢
def inc
begin
page3 = `curl https://api.statuspage.io/v1/pages/incidents.json?page=3 -H "Authorization: OAuth a8ef42"`
JSON.parse(page3).each do |h|
puts "ID : #{h["id"]} , CREATED AT : #{h["created_at"]} , LINK : #{h["shortlink"]} , ISSUE NAME : #{h["name"]} , DESCRIPTION #{h["incident_updates"][0]["status"]} , DESCRIPTION #{h["incident_updates"][1]["status"]}"
end
rescue NoMethodError => e
end
end
试试这个:
def inc
page3 = `curl https://api.statuspage.io/v1/pages/incidents.json?page=3 -H "Authorization: OAuth a8ef42"`
JSON.parse(page3).each do |h|
begin
puts "ID : #{h["id"]} , CREATED AT : #{h["created_at"]} , LINK : #{h["shortlink"]} , ISSUE NAME : #{h["name"]} , DESCRIPTION #{h["incident_updates"][0]["status"]} , DESCRIPTION #{h["incident_updates"][1]["status"]}"
rescue NoMethodError => e
puts e
end
end
end
解释:
每当捕获到异常时,它都会尝试退出发生异常的块。
在您之前的代码中,您是在函数范围内处理它。因此,当异常在迭代中发生时,它退出了循环,因为它没有在它发生的范围内处理(循环),而是在循环外被捕获,因为你把它写在那里(在环形)。
要继续迭代过程,您必须在它发生的地方处理它,这样系统必须知道它已经被完美地处理并且可以执行下一次迭代。
我正在使用下面提到的 curl 解析 JSON 输出,
但是,由于 DESCRIPTION #{h["incident_updates"][1]["status"]
,我在解析输出时得到 no method error
。因为 [["incident_updates"][1][status]]
在某些情况下不存在,所以只有 [["incident_updates"][0][status]]
的值可用。
( 但其他迭代包含 [0][status]
[1][status]
)
所以为了避免使用 rescue
方法的错误,但是错误被阻止但是脚本在第一个错误之后没有执行(迭代在第一个错误本身停止,脚本没有继续)。需要 运行 脚本直到迭代完成(即,尽管 [1] [status]
脚本没有值,但应该 运行 为下一个迭代元素带来值,因为下一个元素可能包含 [1] [status]
)
请帮忙解决这个问题。
提前致谢
def inc
begin
page3 = `curl https://api.statuspage.io/v1/pages/incidents.json?page=3 -H "Authorization: OAuth a8ef42"`
JSON.parse(page3).each do |h|
puts "ID : #{h["id"]} , CREATED AT : #{h["created_at"]} , LINK : #{h["shortlink"]} , ISSUE NAME : #{h["name"]} , DESCRIPTION #{h["incident_updates"][0]["status"]} , DESCRIPTION #{h["incident_updates"][1]["status"]}"
end
rescue NoMethodError => e
end
end
试试这个:
def inc
page3 = `curl https://api.statuspage.io/v1/pages/incidents.json?page=3 -H "Authorization: OAuth a8ef42"`
JSON.parse(page3).each do |h|
begin
puts "ID : #{h["id"]} , CREATED AT : #{h["created_at"]} , LINK : #{h["shortlink"]} , ISSUE NAME : #{h["name"]} , DESCRIPTION #{h["incident_updates"][0]["status"]} , DESCRIPTION #{h["incident_updates"][1]["status"]}"
rescue NoMethodError => e
puts e
end
end
end
解释:
每当捕获到异常时,它都会尝试退出发生异常的块。
在您之前的代码中,您是在函数范围内处理它。因此,当异常在迭代中发生时,它退出了循环,因为它没有在它发生的范围内处理(循环),而是在循环外被捕获,因为你把它写在那里(在环形)。
要继续迭代过程,您必须在它发生的地方处理它,这样系统必须知道它已经被完美地处理并且可以执行下一次迭代。