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

  • Jorrit Jongma

    Jorrit Jongm

    17 Ocak 2008
  • KarnasCamillo

    KarnasCamill

    24 EKİM 2007
  • The10HourMan

    The10HourMan

    28 EYLÜL 2012