Saya memiliki beberapa kode yang perlu menyelamatkan beberapa jenis pengecualian di ruby:
begin
a = rand
if a > 0.5
raise FooException
else
raise BarException
end
rescue FooException, BarException
puts "rescued!"
end
Yang ingin saya lakukan adalah menyimpan daftar jenis pengecualian yang ingin saya selamatkan di suatu tempat dan meneruskan jenis tersebut ke klausa penyelamatan:
EXCEPTIONS = [FooException, BarException]
lalu:
rescue EXCEPTIONS
Apakah ini mungkin, dan apakah mungkin tanpa beberapa panggilan hack-y eval
? Saya tidak berharap karena saya melihat TypeError: class or module required for rescue clause
ketika saya mencoba di atas.
Jawaban:
Anda dapat menggunakan array dengan operator percikan
*
.Jika Anda akan menggunakan konstanta untuk array seperti di atas (dengan
EXCEPTIONS
), perhatikan bahwa Anda tidak dapat mendefinisikannya dalam definisi, dan juga jika Anda mendefinisikannya di kelas lain, Anda harus merujuknya dengan namespace-nya. Sebenarnya, itu tidak harus konstan.Operator Percikan
Operator percikan
*
"membongkar" sebuah array dalam posisinya sehinggaartinya sama dengan
Anda juga dapat menggunakannya dalam literal array sebagai
yang sama dengan
atau dalam posisi argumen
yang berarti
[]
meluas ke kekosongan:Satu perbedaan antara ruby 1.8 dan ruby 1.9 adalah dengan
nil
.Hati-hati dengan objek yang
to_a
didefinisikan, karenato_a
akan diterapkan dalam kasus seperti ini:Dengan jenis objek lain, ia mengembalikan dirinya sendiri.
sumber
EXCEPTIONS
kasus ini? Ingin belajar lebih banyak.rescue InvalidRequestError, CardError => e
(lihat mikeferrier.com/2012/05/19/… )rescue *EXCEPTIONS => e
whereEXCEPTIONS
is array of exception class names.Sedangkan jawabannya diberikan oleh @sawa secara teknis benar, saya kira hal itu menyalahgunakan mekanisme penanganan pengecualian Ruby.
Seperti yang disarankan oleh komentar Peter Ehrlich (dengan menunjuk ke posting blog lama oleh Mike Ferrier ), Ruby sudah dilengkapi dengan mekanisme penanganan pengecualian DRY:
Dengan menggunakan teknik ini, kita dapat mengakses objek pengecualian, yang biasanya memiliki beberapa informasi berharga di dalamnya.
sumber
Saya baru saja mengalami masalah ini dan menemukan solusi alternatif. Dalam kasus Anda
FooException
danBarException
semua akan menjadi kelas pengecualian khusus dan terutama jika semuanya terkait secara tematis, Anda dapat menyusun hierarki pewarisan sedemikian rupa sehingga semuanya akan mewarisi dari kelas induk yang sama dan kemudian hanya menyelamatkan kelas induk.Misalnya saya punya tiga pengecualian:
FileNamesMissingError
,InputFileMissingError
, danOutputDirectoryError
bahwa saya ingin menyelamatkan dengan satu pernyataan. Saya membuat kelas pengecualian lain yang dipanggilFileLoadError
dan kemudian menyiapkan tiga pengecualian di atas untuk mewarisi darinya. Saya kemudian diselamatkan sajaFileLoadError
.Seperti ini:
sumber