如何忽略错误并继续使用其余脚本

时间:2013-09-20 20:00:53

标签: ruby exception-handling amazon-web-services amazon-redshift

一些背景知识。我想删除AWS Redshift集群,这个过程需要30多分钟。所以这就是我想要做的事情:

  1. 开始删除
  2. 每隔1分钟检查群集状态(应该是“删除”)
  3. 删除群集时,命令将失败(因为它 找不到群集了。因此,请记录一些消息并继续使用脚本的其余部分
  4. 这是我在while循环中运行的命令,用于在开始删除后检查群集状态:

    resp = redshift.client.describe_clusters(:cluster_identifier=>"blahblahblah")
    

    在删除过程继续时,上面的命令将使我的群集状态为deleting。但是一旦完全删除了集群,那么命令本身就会失败,因为它找不到集群blahblahblah

    删除群集后,以下是命令错误:

    /var/lib/gems/1.9.1/gems/aws-sdk-1.14.1/lib/aws/core/client.rb:366:in `return_or_raise': Cluster blahblahblah not found. (AWS::Redshift::Errors::ClusterNotFound)
    

    我同意这个错误。但这使我的脚本突然退出。所以我想记录一条消息The cluster is deleted....continuing并继续我的脚本。

    我尝试过以下设置

    resp = redshift.client.describe_clusters(:cluster_identifier=>"blahblahblah")
     || raise (“The cluster is deleted....continuing”)
    

    我还尝试了https://www.ruby-forum.com/topic/133876中提到的一些建议 但这不起作用。上面的命令无法找到群集后,我的脚本退出。

    问题: 如何忽略错误,打印我自己的消息“群集被删除....继续”并继续脚本?

    感谢。

2 个答案:

答案 0 :(得分:1)

def delete_clusters clusters=[]
  cluster.each do |target_cluster|
    puts "will delete #{target_clust}"

    begin 
      while (some_condition) do
        resp = redshift.client.describe_clusters(:cluster_identifier => target_clust)
        # break condition
      end
    rescue AWS::Redshift::Errors::ClusterNotFound => cluster_exception
      raise ("The cluster, #{target_clust} (#{cluster_excption.id}), is deleted....continuing")
    end

    puts "doing other things now"
    # ....
  end
end

答案 1 :(得分:1)

@NewAlexandria,我将您的代码更改为如下所示:

puts "Checking the cluster status"
begin
  resp = redshift.client.describe_clusters(:cluster_identifier=>"blahblahblah")
rescue AWS::Redshift::Errors::ClusterNotFound => cluster_exception
  puts "The cluster is deleted....continuing"
end
puts "seems like the cluster is deleted and does not exist"

<强>输出:

Checking the cluster status
The cluster is deleted....continuing
seems like the cluster is deleted and does not exist

我将raise更改为紧跟在您的回复中puts行之后的行中的rescue。这样我摆脱了上面评论中提到的RuntimeError

我不知道这是什么意思。我甚至不知道这是否是正确的做法。但它会在未找到群集时显示错误,然后继续执行脚本。

后来我读了很多关于ruby exception/rescue/raise/throw的文章....但这对我来说太难理解,因为我根本不属于编程背景。所以,如果你能解释一下这里发生了什么,对我来说,对ruby更有信心真的很有帮助。

感谢您的时间。