Saya melewati program ruby lama yang berjalan lama, yang memiliki banyak kejadian
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
sepanjang itu.
Tanpa melacak setiap kemungkinan pengecualian yang masing-masing dapat tangani (setidaknya tidak segera), saya masih ingin menutupnya sesekali CtrlC.
Dan saya ingin melakukannya dengan cara yang hanya menambah kode (jadi saya tidak memengaruhi perilaku yang ada, atau melewatkan pengecualian yang tertangkap di tengah proses.)
[ CtrlCadalah SIGINT, atau SystemExit, yang tampaknya setara dengan SignalException.new("INT")
sistem penanganan pengecualian Ruby. class SignalException < Exception
, itulah mengapa masalah ini muncul.]
Kode yang ingin saya tulis adalah:
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
EDIT: Kode ini berfungsi, selama Anda mendapatkan kelas pengecualian yang ingin Anda perangkap dengan benar. Itu adalah SystemExit, Interrupt, atau IRB :: Abort seperti di bawah ini.
sumber
rescue SystemExit, Interrupt raise rescue Exception => e
Jika Anda dapat menyelesaikan seluruh program, Anda dapat melakukan sesuatu seperti berikut:
Ini pada dasarnya memiliki CtrlCpenggunaan catch / throw alih-alih penanganan pengecualian, jadi kecuali kode yang ada sudah memiliki catch: ctrl_c di dalamnya, itu akan baik-baik saja.
Sebagai alternatif, Anda dapat melakukan a
trap("SIGINT") { exit! }
.exit!
segera keluar, itu tidak memunculkan pengecualian sehingga kode tidak dapat menangkapnya secara tidak sengaja.sumber
SIGINT
berfungsi dengan baik untuk saya.Jika Anda tidak dapat membungkus seluruh aplikasi Anda dalam satu
begin ... rescue
blok (misalnya, Thor), Anda dapat menjebakSIGINT
:130 adalah kode keluar standar.
sumber
130 | Script terminated by Control-C | Ctl-C | Control-C is fatal error signal 2, (130 = 128 + 2, see above)
)Saya menggunakan
ensure
untuk efek yang bagus! Ini untuk hal-hal yang Anda inginkan terjadi ketika barang Anda berakhir tidak peduli mengapa itu berakhir.sumber
Menangani Ctrl-C dengan rapi di Ruby dengan cara ZeroMQ:
Sumber
sumber