Ruby on rails 在ruby中执行rescue后继续脚本

Ruby on rails 在ruby中执行rescue后继续脚本,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,我使用下面提到的curl解析JSON输出, 但是,由于说明{h[“事件更新”][1][“状态”],我在解析输出时没有方法错误。因为[“事件更新”][1][status]在某些情况下不存在,所以只有[“事件更新”][0][status]]的值可用 (但其他迭代包含[0][status] [1][status]) 因此,为了避免使用rescue方法时出现错误,虽然防止了错误,但在第一个错误后脚本不会执行(第一个错误本身停止了迭代,脚本不会继续)。需要运行脚本,直到迭代完成(即,[1][status]

我使用下面提到的curl解析JSON输出, 但是,由于
说明{h[“事件更新”][1][“状态”]
,我在解析输出时没有方法错误。因为
[“事件更新”][1][status]
在某些情况下不存在,所以只有
[“事件更新”][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
说明:

每当捕获到异常时,它都会尝试退出发生异常的块

在以前的代码中,您是在函数的作用域中处理它的。因此,当异常在迭代中发生时,它会退出循环,因为它没有在发生的作用域(循环)内处理,而在循环的正外部被捕获,因为您在那里编写了它(循环外部)

要继续迭代过程,您必须在迭代发生的地方处理它,以便系统必须知道它已被完美地处理,并且可以执行下一次迭代。

尝试以下方法:

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
说明:

每当捕获到异常时,它都会尝试退出发生异常的块

在以前的代码中,您是在函数的作用域中处理它的。因此,当异常在迭代中发生时,它会退出循环,因为它没有在发生的作用域(循环)内处理,而在循环的正外部被捕获,因为您在那里编写了它(循环外部)


要继续迭代过程,您必须在它发生的地方处理它,以便系统必须知道它被完美地处理,并且可以执行下一次迭代。

它工作了,谢谢..似乎只有代码应该在
begin
下,尽管我们在迭代?它工作了,谢谢..似乎只有代码应该在
begin
虽然我们正在迭代?而不是捕获异常,但您可能希望改用(自Ruby 2.3起提供)。@HolgerJust谢谢,我也会研究它。您可能希望改用(自Ruby 2.3起提供),而不是捕获异常。@HolgerJust谢谢,我也会研究它。