के बीच संबंध है Failureऔर Exceptionयह है कि एक Failureहै Exception- कि कहने के लिए है, यह अपने राज्य के हिस्से के रूप में अपवाद वस्तु रखती है। कुछ इस तरह:
class Failure {
has Exception $.exception;
# ...
}
जब एक Failure"विस्फोट" होता है, तो वह ऐसा करके फेंक देता है Exceptionजो उसके अंदर होता है। इस प्रकार, जो CATCHब्लॉक तक पहुंचता है वह Exceptionवस्तु है, और एनक्लोजिंग के लिए कोई लिंक वापस नहीं है Failure। (वास्तव में, किसी दिए गए Exceptionऑब्जेक्ट को कई Failureएस द्वारा आयोजित किया जा सकता है ।)
इसलिए, इसका पता लगाने का कोई सीधा तरीका नहीं है। एक डिजाइन के नजरिए से, आपको शायद नहीं होना चाहिए, और अपनी समस्या को हल करने का एक अलग तरीका खोजना चाहिए। A Failureकेवल एक अपवाद को फेंकने का एक तरीका है और इसे एक मूल्य के रूप में माना जा सकता है; इसका उद्देश्य यह नहीं है कि अंतर्निहित समस्या की प्रकृति बदल जाती है क्योंकि इसे नियंत्रण प्रवाह के तत्काल हस्तांतरण के बजाय एक मूल्य के रूप में व्यक्त किया जाता है। दुर्भाग्य से, मूल लक्ष्य प्रश्न में नहीं कहा गया था; आपको नियंत्रण अपवादों को देखने के लिए उपयोगी हो सकता है, लेकिन अन्यथा आप जिस अंतर्निहित समस्या को हल करने का प्रयास कर रहे हैं, उसके बारे में एक और प्रश्न पोस्ट करें। शायद एक बेहतर तरीका है।
पूर्णता के लिए, मैं वहाँ है कि ध्यान दें जाएगा रहे हैं अप्रत्यक्ष तरीके से एक का पता लगा सकते है कि कि Exceptionएक से फेंक दिया गया था Failure। उदाहरण के लिए, यदि आप .backtraceअपवाद ऑब्जेक्ट को प्राप्त करते हैं और शीर्ष फ्रेम के पैकेज को देखते हैं, तो यह निर्धारित करना संभव है कि यह Failureनिम्न से आता है :
sub foo() { fail X::AdHoc.new(message => "foo") }
try {
foo();
CATCH {
note do { no fatal; .backtrace[0].code.package ~~ Failure };
.resume
}
}
हालाँकि, यह बहुत हद तक कार्यान्वयन विवरण पर निर्भर है जो आसानी से बदल सकता है, इसलिए मैं इस पर भरोसा नहीं करता।