如何忽略错误并继续脚本的其余部分

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) 你继续前进。 如果您现在已经得出了解决方案,我认为您应该接受您的答案或我的答案

以上是关于如何忽略错误并继续脚本的其余部分的主要内容,如果未能解决你的问题,请参考以下文章

告诉 Impala 忽略错误并继续

如果批处理脚本无法写入输出文件,如何忽略错误

powershell/sqlplus 错误 SP2-0042:未知命令“■@” - 忽略行的其余部分

SublimeLinter 忽略缺少的分号

RxSwift - PublishSubject - 忽略错误并继续订阅(不要处置)

如何将错误重定向到变量