Hubungan antara Failure
dan Exception
adalah bahwa a Failure
memiliki Exception
- yaitu, ia memegang objek pengecualian sebagai bagian dari kondisinya. Sesuatu seperti ini:
class Failure {
has Exception $.exception;
# ...
}
Ketika Failure
"meledak", ia melakukannya dengan melemparkan Exception
yang ada di dalamnya. Jadi, yang mencapai CATCH
blok adalah Exception
objek, dan tidak ada tautan kembali ke lampiran Failure
. (Pada kenyataannya, Exception
objek yang diberikan pada prinsipnya dapat dipegang oleh banyak orang Failure
.)
Karena itu, tidak ada cara langsung untuk mendeteksi ini. Dari perspektif desain, Anda mungkin seharusnya tidak, dan harus menemukan cara berbeda untuk menyelesaikan masalah Anda. A Failure
hanyalah cara untuk menunda melempar pengecualian dan membiarkannya diperlakukan sebagai nilai; itu tidak dimaksudkan bahwa sifat dari masalah yang mendasarinya berubah karena itu disampaikan sebagai nilai daripada sebagai transfer langsung dari aliran kontrol. Sayangnya, tujuan awal tidak disebutkan dalam pertanyaan; Anda mungkin menemukan itu berguna untuk melihat pengecualian kontrol, tetapi sebaliknya mengirim pertanyaan lain tentang masalah mendasar yang Anda coba selesaikan. Mungkin ada cara yang lebih baik.
Untuk kelengkapan, saya akan perhatikan bahwa ada yang cara tidak langsung yang satu dapat mendeteksi bahwa Exception
dilemparkan oleh Failure
. Misalnya, jika Anda mendapatkan .backtrace
objek pengecualian dan melihat paket frame atas, dimungkinkan untuk menentukan bahwa itu berasal dari Failure
:
sub foo() { fail X::AdHoc.new(message => "foo") }
try {
foo();
CATCH {
note do { no fatal; .backtrace[0].code.package ~~ Failure };
.resume
}
}
Namun, ini sangat tergantung pada detail implementasi yang dapat dengan mudah diubah, jadi saya tidak akan bergantung padanya.
try
Blok menyiratkanuse fatal
pragma, yang berarti setiapFailure
panggilan balik yang dilakukan dalam blok segera dikonversi menjadi pengecualian. Hanya saja jangan gunakantry
; aCATCH
bisa masuk di blok mana pun di Raku (jadi miliki saja di tingkatsub
). Atau, tulisno fatal
di bagian atastry
blok Anda .True
pada versi Rakudo yang saya miliki secara lokal. Jika tidak ada pada Anda, itu hanya membuktikan titik tentang kerapuhan melakukan ini.Hapus
try
bungkusnya:Kamu dulu
try
. Atry
melakukan beberapa hal, tetapi hal yang penting di sini adalah bahwa ia memberitahu Raku untuk segera mempromosikan apapunFailure
dalam ruang lingkupnya ke pengecualian - yang menurut Anda tidak Anda inginkan. Jadi solusi paling sederhana adalah berhenti melakukan itu.Jawaban ini hanya mengulangi sebagian dari penjelasan jnthn (lihat komentar khusus yang ditulisnya di bawah jawabannya). Tapi saya tidak yakin semua pembaca akan melihat / memahami aspek ini, dan tidak berpikir satu atau dua komentar pada jawaban jnthn akan membantu, maka jawaban ini.
Saya telah menulis ini sebagai jawaban komunitas untuk memastikan saya tidak akan mendapat manfaat dari upvotes karena itu jelas tidak menjamin itu. Jika cukup downvotes kami hanya akan menghapusnya.
sumber