के बीच संबंध है 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
}
}
हालाँकि, यह बहुत हद तक कार्यान्वयन विवरण पर निर्भर है जो आसानी से बदल सकता है, इसलिए मैं इस पर भरोसा नहीं करता।