1

Некоторые фоне. Я хочу удалить кластер AWS Redshift, и процесс занимает более 30 минут. Так это то, что я хочу сделать:Как игнорировать ошибку и продолжить с остальной частью сценария

  1. Начать удаление
  2. Каждый 1 минуту, проверьте состояние кластера (оно должно быть «удаление»)
  3. Когда кластер будет удален, команда потерпит неудачу (потому что он больше не может найти кластер). Так войти какое-то сообщение и продолжить с остальной частью сценария

Это команда бегаю в 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 
+0

Спасибо. Я просто удалил кластер. Мне понадобится еще 2 часа, чтобы проверить ваше решение. Я скоро отправлю отзыв. – slayedbylucifer

+0

@slayedbylucifer Я сделал важный режим, наряду с другой демонстрацией –

+0

@Newlexandria, код все еще не работает, и скрипт выходит сразу. На этот раз я получаю «RuntimeError», который отличается от предыдущей предыдущей: '/home/AWS/aws_redshift_ops.rb:22:in rescue в

': кластер удален ... продолжающийся (RuntimeError) \t из/home /AWS/aws_redshift_ops.rb:19:in
'' – slayedbylucifer

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, о котором я упоминал в своем комментарии выше.

Я не знаю, каковы последствия этого. Я даже не знаю, правильно ли это сделать. Но он показывает ошибку, когда кластер не найден, а затем продолжает сценарий.

Позже я прочитал много статей о рубине exception/rescue/raise/throw .... но это было слишком много для меня, чтобы понять, поскольку я вообще не принадлежу к программированию. Итак, если бы вы могли объяснить, что здесь происходит, мне будет полезно получить больше уверенности в рубине.

Спасибо за ваше время.

+0

Без опасностей. Вы сделали прекрасную вещь, упростив мой ответ. Ядро: 1) вы «начинаете» блок, после которого вы можете «спасать», 2) вы «спасаете» класс исключения, который исходит из кода AWS, 3) вы печатаете неблокирующее сообщение, и 4) вы двигаетесь дальше. –

+0

Я думаю, что вы должны принять либо свой ответ, либо мою, если вы получили решение на данный момент –

Смежные вопросы