一些背景知识。我想删除AWS Redshift集群,这个过程需要30多分钟。所以这就是我想要做的事情:
这是我在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中提到的一些建议 但这不起作用。上面的命令无法找到群集后,我的脚本退出。
问题: 如何忽略错误,打印我自己的消息“群集被删除....继续”并继续脚本?
感谢。
答案 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更有信心真的很有帮助。
感谢您的时间。