一些背景。 我想删除AWS红移集群,这一过程需要超过30分。 所以,这就是我想做的事:
- 启动删除
- 每1分钟,确认集群的状态(这应该是“删除”)
- 当集群被删除,该命令会失败(因为它无法找到群集了)。 所以记录一些信息,并继续与脚本的休息
这是我在一个运行命令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但是,这是行不通的。 上面的命令无法找到群集我退出脚本一次。
问题 :如何忽略错误,打印自己的消息,说“群集被删除....继续”,并继续执行脚本?
谢谢。
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
@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"
OUTPUT:
Checking the cluster status
The cluster is deleted....continuing
seems like the cluster is deleted and does not exist
我改变了raise
,以puts
于紧随行rescue
在响应行。 这样,我摆脱了的RuntimeError
,我在我的评论中提到的上方。
我不知道这有什么寓意。 我甚至不知道这是否是做正确的方式。 但它表明,当集群没有发现错误,然后用脚本将继续。
后来我读了很多关于红宝石文章exception/rescue/raise/throw
....但那只是太多,我听不懂,因为我不属于编程背景的。 所以,如果你能解释这是怎么回事,这将非常有帮助,我得到的红宝石更多的信心。
谢谢你的时间。