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.