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

  • ColdfusTion

    ColdfusTion

    3 Aralık 2007
  • Learn word 2013 tutorials

    Learn word 2

    5 AĞUSTOS 2014
  • Palmundo Ec

    Palmundo Ec

    11 HAZİRAN 2009