ruby脚本显示错误但继续

时间:2015-06-06 20:32:37

标签: ruby ruby-2.0

我正在尝试运行多行完全独立的代码,其中任何行都可能抛出错误。如何在不停止的情况下完成脚本运行(有或没有记录错误)?我试图避免在每一行使用开始/救援

我尝试运行的一些(很多)行:

int k=1;
//n= no of rows/cols
array[0][0]=1;
for(i=0;i<n;i++)
{
    for(j=0;j<=i;j++) //column
    array[j][i]=k++;

    for(j=i-1;j>=0;j--)  //row
    array[i][j]=k++;
}

2 个答案:

答案 0 :(得分:0)

你可以按照建议在整个街区周围放一个开始..救援,或者你也可以这样做:

begin
  # one or more lines of code
rescue firstPotentialExecption
  # one or lines of code 
rescue nextPotentialExecption
  # ...
else
  # AnyOtherExecptions
end

或者您可以尝试找出最终得到的异常,并且只有一个救援声明。

答案 1 :(得分:0)

如果不在每一行使用begin / rescue,我都不知道如何解决这个问题。但是,您的示例显示某些行依赖于前一行的结果,因此在前一行失败时执行是没有意义的。此外,基本设置的前几行也可能引发异常,因为没有id,文件的其余部分也可能会失败。

你可以在begin / rescue块中包装有意义的块,然后如果失败则将消息打印到stderr(或做其他事情):

Steam.apikey = '8_____1' #http://steamcommunity.com/dev/apikey
$stdout.reopen("playergamedump.csv", "w")
id = Steam::User.vanity_to_steamid("MEEE")

begin
  badges_hash = Steam::Player.badges(id)
  puts "###BADGES###"
  puts badges_hash
rescue StandardError
  $sterr.puts "Failed to get badges"
end

begin
  steam_level = Steam::Player.steam_level(id)
  puts "###STEAM LEVEL###"
  puts steam_level
rescue StandardError
  $sterr.puts "Failed to get steam_level"
end

如果文件的其余部分看起来相同,您可以继续通过将用户属性的名称存储在数组中并使用public_send动态请求它们来删除复制:

Steam.apikey = '8_____1' #http://steamcommunity.com/dev/apikey
$stdout.reopen("playergamedump.csv", "w")
id = Steam::User.vanity_to_steamid("MEEE")

[
  :badges,
  :steam_level,
  ...
].each do |property|
  begin
    value = Steam::Player.public_send(property, id)
    title = property.tr('_', ' ').upcase
    puts "####{title}###"
    puts value
  rescue StandardError
    $sterr.puts "Failed to get #{property}"
  end
end