Failureএবং এর মধ্যে সম্পর্কটি Exceptionহ'ল একটিতে একটি Failureরয়েছে Exception- এটি বলতে গেলে এটি তার রাজ্যের অংশ হিসাবে ব্যতিক্রমী বিষয়টিকে ধারণ করে। এটার মতো কিছু:
class Failure {
has Exception $.exception;
# ...
}
যখন একটি Failure"বিস্ফোরিত হয়", তখন এটি এর Exceptionভিতরে থাকাটি ফেলে দিয়ে তা করে। সুতরাং, CATCHব্লকে যা পৌঁছায় তা হ'ল Exceptionঅবজেক্ট, এবং ঘেরের সাথে কোনও লিঙ্ক নেই Failure। (আসলে, একটি প্রদত্ত Exceptionবস্তু নীতিগতভাবে অনেকগুলি দ্বারা ধারণ করতে পারে Failure))
অতএব, এটি সনাক্ত করার সরাসরি কোনও উপায় নেই। ডিজাইনের দৃষ্টিকোণ থেকে আপনার সম্ভবত হওয়া উচিত নয় এবং আপনার সমস্যা সমাধানের জন্য আলাদা উপায় খুঁজে পাওয়া উচিত। একজন Failureএক ব্যতিক্রমের নিক্ষেপ এবং অনুমোদন করার জন্য এটি একটি মান হিসাবে চিকিত্সা করা মুলতবি মাত্র একটি উপায়; অন্তর্নিহিত সমস্যার প্রকৃতি পরিবর্তিত হয় না কারণ এটি নিয়ন্ত্রণ প্রবাহের তাত্ক্ষণিক স্থানান্তর হিসাবে মান হিসাবে প্রকাশিত হয় intended দুর্ভাগ্যক্রমে, প্রশ্নটিতে মূল লক্ষ্যটি বর্ণিত হয়নি; নিয়ন্ত্রণ ব্যতিক্রমগুলি দেখতে আপনার পক্ষে এটি দরকারী মনে হতে পারে তবে অন্যথায় সম্ভবত আপনি সমাধান করার চেষ্টা করছেন এমন অন্তর্নিহিত সমস্যা সম্পর্কে অন্য একটি প্রশ্ন পোস্ট করুন। সম্ভবত আরও ভাল উপায় আছে।
সম্পূর্ণতার জন্য, আমি নোট করব যে অপ্রত্যক্ষ উপায় আছে যেগুলি সনাক্ত করতে পারে যে এটি 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
}
}
তবে এটি বাস্তবায়নের বিবরণগুলির উপর খুব বেশি নির্ভর করে যা সহজেই পরিবর্তিত হতে পারে, সুতরাং আমি এটির উপর নির্ভর করি না।