SORU
18 Ocak 2010, PAZARTESİ


Yakalama-c Ctrl ruby

Uzun süren bir miras geçti ben sayısız tanımında olan ruby programı

begin
  #dosomething
rescue Exception => e
  #halt the exception's progress
end

o boyunca.

Her işleme olabilir bu her olası Durum İzleme olmadan (en azından hemen), hala zaman zaman aşağı kes için mümkün olmak istiyorumCtrlC.

Ve bu yüzden tek kod ekleyen bir yol (mevcut davranışını etkiler, ya da bir çalışma ortasında yakaladı aksi bir durum özlemiyorum.) yapmak istiyorum

[CtrlCSignalException.new("INT") eşdeğer olarak görünen SIGINT, ya SystemExit, Ruby'nin özel durum işleme sistemi. Bu sorun çıkıyor ediliyor class SignalException < Exception,.]

Yazılı istiyorum kod şöyle olacaktır:

begin
  #dosomething
rescue SignalException => e
  raise e
rescue Exception => e
  #halt the exception's progress
end

EDİT: Bu kod çalışır, sürece tuzak düzeltmek istediğiniz özel sınıf olsun. Ya SystemExit, Kesme, ya da IRB::aşağıda İptal gibi.

CEVAP
18 Ocak 2010, PAZARTESİ


Sorun Ruby bir program sona erdiğinde, yani yükselterek yapmasıdırSystemExit. Control-C geldiğinde, yükseltirKesme. Her iki yanaSystemExitveKesmekaynaklanıyorÖzel durumözel durum işleme onun parça çıkmak veya kesme durduruluyor. İşte düzeltme:

Her yerde yapabilirsiniz, değiştirin

rescue Exception => e
  # ...
end

için

rescue StandardError => e
  # ...
end

bu StandardError, yeniden ayağa kaldırmak için özel değiştiremezsin:

rescue Exception => e
  # ...
  raise
end

veya, en azından, yeniden yükseltmek SystemExit ve Kesme

rescue SystemExit, Interrupt
  raise
rescue Exception => e
  #...
end

Yaptığınız tüm özel durumlar sağlanmalıStandardErrordeğilÖzel durum.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ionized Digital Air Studios

    Ionized Digi

    20 HAZİRAN 2009
  • Kanaal van Dj0fifty

    Kanaal van D

    28 EKİM 2011
  • EmbarkToHeaven

    EmbarkToHeav

    3 EYLÜL 2007