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
}
}
তবে এটি বাস্তবায়নের বিবরণগুলির উপর খুব বেশি নির্ভর করে যা সহজেই পরিবর্তিত হতে পারে, সুতরাং আমি এটির উপর নির্ভর করি না।