উত্তর:
std::exception
এমন শ্রেণি যাঁর একমাত্র উদ্দেশ্য ব্যতিক্রম শ্রেণিবিন্যাসের বেস ক্লাস হিসাবে পরিবেশন করা। এর অন্য কোন ব্যবহার নেই। অন্য কথায়, ধারণাগতভাবে এটি একটি বিমূর্ত শ্রেণি (যদিও এটি শব্দটির সি ++ অর্থের মধ্যে বিমূর্ত শ্রেণি হিসাবে সংজ্ঞায়িত হয়নি)।
std::runtime_error
std::exception
বিভিন্ন রানটাইম ত্রুটির ক্ষেত্রে নিক্ষেপ করার উদ্দেশ্যে উত্সাহিত করা একটি আরও বিশেষ শ্রেণিবদ্ধ শ্রেণী । এটির দ্বৈত উদ্দেশ্য রয়েছে। এটি নিজে নিক্ষিপ্ত হতে পারে, অথবা এটি যেমন রানটাইম এরর ব্যতিক্রম বিভিন্ন আরও বেশি বিশেষ ধরনের, এর একটি বেস শ্রেণী হিসেবে পরিবেশন করা যাবে std::range_error
, std::overflow_error
ইত্যাদি আপনি আপনার নিজের ব্যতিক্রম শ্রেণীর সাজানো বর্ণনা করতে পারেন std::runtime_error
, সেইসাথে আপনি আপনার নিজের ব্যতিক্রম বর্ণনা করতে পারেন ক্লাস থেকে অবতরণ std::exception
।
ঠিক তেমন std::runtime_error
, স্ট্যান্ডার্ড লাইব্রেরিতেও রয়েছে std::logic_error
, নেমে আসা std::exception
।
এই শ্রেণিবিন্যাসের বিষয়টি হ'ল ব্যবহারকারীকে সি ++ ব্যতিক্রম হ্যান্ডলিং প্রক্রিয়াটির সম্পূর্ণ শক্তি ব্যবহারের সুযোগ দেওয়া। যেহেতু 'ক্যাচ' ধারাটি পলিমারফিক ব্যতিক্রমগুলি ধরতে পারে, তাই ব্যবহারকারী 'ক্যাচ' ধারাগুলি ব্যতিক্রম শ্রেণিবদ্ধের একটি নির্দিষ্ট সাবট্রি থেকে ব্যতিক্রম প্রকারগুলি ধরতে পারে write উদাহরণস্বরূপ, সাবট্রি catch (std::runtime_error& e)
থেকে সমস্ত ব্যতিক্রম ধরা পড়বে std::runtime_error
, অন্য সকলকে দিয়ে যেতে দেবে (এবং কল স্ট্যাকটি আরও উড়ে যাবে)।
পিএস একটি দরকারী ব্যতিক্রম শ্রেণীর শ্রেণিবিন্যাসের নকশা তৈরি করা (এটি আপনাকে কেবলমাত্র আপনার কোডের প্রতিটি পয়েন্টে আগ্রহী ব্যতিক্রমগুলি ধরতে দেয়) অ-তুচ্ছ কাজ। আপনি স্ট্যান্ডার্ড সি ++ লাইব্রেরিতে যা দেখছেন তা হ'ল একটি সম্ভাব্য পন্থা যা ভাষার লেখকরা আপনাকে দিয়ে থাকে। আপনি দেখতে পাচ্ছেন, তারা সমস্ত ব্যতিক্রম প্রকারগুলি "রানটাইম ত্রুটি" এবং "লজিক ত্রুটি "গুলিতে বিভক্ত করার সিদ্ধান্ত নিয়েছে এবং আপনাকে সেখান থেকে আপনার নিজস্ব ব্যতিক্রম প্রকারগুলি দিয়ে এগিয়ে যেতে দেয়। অবশ্যই, শ্রেণিবিন্যাস গঠনের বিকল্প উপায় রয়েছে যা আপনার নকশায় আরও উপযুক্ত হতে পারে।
আপডেট: পোর্টেবিলিটি লিনাক্স বনাম উইন্ডোজ
যেমন লোকি আস্তারি এবং ইউনিক্সমান ৩ below তাদের উত্তর এবং নীচে দেওয়া মন্তব্যে উল্লিখিত হয়েছে, exception
শ্রেণীর নির্মাতা সি ++ স্ট্যান্ডার্ড অনুযায়ী কোনও যুক্তি গ্রহণ করেন না। মাইক্রোসফ্ট সি ++ এর exception
ক্লাসে যুক্তিযুক্ত কনস্ট্রাক্টর রয়েছে তবে এটি মানক নয়। runtime_error
বর্গ একটি কন্সট্রাকটর গ্রহণ আর্গুমেন্টগুলি (হয়েছে char*
উভয় প্লাটফর্ম, উইন্ডোজ এবং লিনাক্স)। পোর্টেবল হতে, আরও ভাল ব্যবহার runtime_error
।
(এবং মনে রাখবেন, কেবল আপনার প্রকল্পের একটি স্পেসিফিকেশন বলে যে আপনার কোডটি লিনাক্সে চলতে হবে না, এর অর্থ এই নয় যে এটি কখনই লিনাক্সে চালিত হয় না))
std::exception
। অবশ্যই, সমস্ত std
জিনিস সেগুলির উত্পন্ন ক্লাস নিক্ষেপ করে তবে কেবল std::exception
উত্পন্ন বস্তু নিক্ষেপ করার কোনও কারণ নেই ।
std::exception
মান ব্যতিক্রম শ্রেণিবিন্যাসের বিমূর্ত বেস বিবেচনা করা উচিত (বিবেচিত দ্রষ্টব্য)। এটি কারণ যে কোনও নির্দিষ্ট বার্তায় পাস করার কোনও ব্যবস্থা নেই (এটি করার জন্য আপনাকে অবশ্যই উত্সাহিত করতে এবং বিশেষজ্ঞ করতে হবে what()
)। আপনাকে std :: ব্যতিক্রম ব্যবহার করা থেকে বিরত করার কিছুই নেই এবং সাধারণ অ্যাপ্লিকেশনগুলির জন্য এটি আপনার প্রয়োজন হতে পারে।
std::runtime_error
অন্যদিকে বৈধ নির্মাণকারী রয়েছে যা একটি বার্তা হিসাবে একটি স্ট্রিং গ্রহণ করে। যখন what()
কনস্ট্র্ট চর পয়েন্টার বলা হয় তখন সি স্ট্রিংয়ের বিন্দুতে যে বিন্দুটি কনস্ট্রাক্টরে পাস হয়েছিল একই স্ট্রিংয়ের সাথে ফিরে আসে।
try
{
if (badThingHappened)
{
throw std::runtime_error("Something Bad happened here");
}
}
catch(std::exception const& e)
{
std::cout << "Exception: " << e.what() << "\n";
}
std::exception(std::string)
। এখন আমি বুঝতে পেরেছি যে std::runtime_error
আমার কোডটি লিনাক্সে (জিসিসি) কাজ করতে চাইলে আমাকে অবশ্যই ফেলে দিতে হবে ।