我试图运行多行完全独立的代码,其中任何行都可能抛出错误。如何才能让脚本运行(有或没有日志记录错误),直到它完成而不停止呢?我试图避免在每一行上使用begin/ every。
我尝试运行的(许多)行中的一些:
Steam.apikey = '8_____1' #http://steamcommunity.com/dev/apikey
$stdout.reopen("playergamedump.csv", "w")
id= Steam::User.vanity_to_steamid("MEEE")
badges_hash= Steam::Player.badges(id)
puts "###BADGES###"
puts badges_hash
steam_level=Steam::Player.steam_level(id)
puts "###STEAM LEVEL###"
puts steam_level
....发布于 2015-06-06 20:58:30
如果不在每一行上使用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发布于 2015-06-06 20:57:46
你可以像建议的那样放个开始。拯救整个街区,或者你也可以这样做:
begin
# one or more lines of code
rescue firstPotentialExecption
# one or lines of code
rescue nextPotentialExecption
# ...
else
# AnyOtherExecptions
end或者,你可以试着找出你在最后得到什么异常,而只有一条救援声明。
https://stackoverflow.com/questions/30687313
复制相似问题