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

  • Disney Pets and Animals

    Disney Pets

    29 ŞUBAT 2012
  • Mary Jane Tauyan

    Mary Jane Ta

    20 AĞUSTOS 2009
  • wafflepwn

    wafflepwn

    14 AĞUSTOS 2008