如何忽略错误并继续脚本的其余部分
Posted
技术标签:
【中文标题】如何忽略错误并继续脚本的其余部分【英文标题】:How to ignore error and continue with rest of the script 【发布时间】:2013-09-20 20:00:52 【问题描述】:一些背景。我想删除 AWS Redshift 集群,这个过程需要 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 中提到的一些建议 但这不起作用。一旦上述命令找不到集群,我的脚本就会退出。
问题: 如何忽略错误,打印我自己的消息“集群已删除....继续”并继续执行脚本?
谢谢。
【问题讨论】:
【参考方案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
【讨论】:
谢谢。我刚刚删除了一个集群。我还需要 2 小时来测试您的解决方案。我会尽快发布我的反馈。 @slayedbylucifer 我已经制作了一个重要的模式,以及其他演示 @Newlexandria,代码仍然失败,脚本立即退出。这次我得到了一个RuntimeError
,这与以前的不同:/home/AWS/aws_redshift_ops.rb:22:in rescue in <main>': The cluster is deleted...continuing (RuntimeError) from /home/AWS/aws_redshift_ops.rb:19:in <main>'
请在下面找到我的答案。
您不可能逐字使用此代码。 puts custom_exception
在救援块内查看引发的错误对象的结构。然后,您希望可以看到它具有哪些属性,当流程到达这一点并继续时,您可以使用这些属性来创建有价值的响应。然后你可以用不会引发另一个错误的东西替换custom_exception.id
。【参考方案2】:
@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
我在您回复中紧跟rescue
行之后的行中将raise
更改为puts
。这样我就摆脱了我在上面评论中提到的RuntimeError
。
我不知道这意味着什么。我什至不知道这是否是正确的方法。但是当找不到集群时它会显示错误,然后继续执行脚本。
后来我读了很多关于 ruby 的文章 exception/rescue/raise/throw
.... 但这对我来说太难理解了,因为我根本不属于编程背景。所以,如果你能解释一下这里发生了什么,这将有助于我对 ruby 更有信心。
感谢您的宝贵时间。
【讨论】:
没有危险。通过简化我的答案,您做得很好。核心在那里:1)你begin
一个块,然后你可以rescue
来自,2)你rescue
来自AWS代码的异常类,3)你打印一个非阻塞消息, 4) 你继续前进。
如果您现在已经得出了解决方案,我认为您应该接受您的答案或我的答案以上是关于如何忽略错误并继续脚本的其余部分的主要内容,如果未能解决你的问题,请参考以下文章
powershell/sqlplus 错误 SP2-0042:未知命令“■@” - 忽略行的其余部分