Hubungan antara Failuredan Exceptionadalah bahwa a Failurememiliki 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 Exceptionyang ada di dalamnya. Jadi, yang mencapai CATCHblok adalah Exceptionobjek, dan tidak ada tautan kembali ke lampiran Failure. (Pada kenyataannya, Exceptionobjek 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 Failurehanyalah 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 Exceptiondilemparkan oleh Failure. Misalnya, jika Anda mendapatkan .backtraceobjek 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.