কাস্টম ব্যতিক্রমগুলির ক্ষেত্রে এখানে একটি অতিরিক্ত নোট বর্ণিত অন্যান্য উত্তরে ADD করতে চেয়েছিলেন ।
আপনি যখন নিজের কাস্টম ব্যতিক্রম তৈরি করেন সেই ক্ষেত্রে std::exception
, যখন আপনি "সমস্ত সম্ভাব্য" ব্যতিক্রম প্রকারগুলি ধরেন, আপনার সর্বদা catch
ধরা পড়তে পারে এমন "সর্বাধিক প্রাপ্ত" ব্যতিক্রম প্রকারের সাথে ক্লজগুলি শুরু করা উচিত । (কি উদাহরণ দেখুন না করতে):
#include <iostream>
#include <string>
using namespace std;
class MyException : public exception
{
public:
MyException(const string& msg) : m_msg(msg)
{
cout << "MyException::MyException - set m_msg to:" << m_msg << endl;
}
~MyException()
{
cout << "MyException::~MyException" << endl;
}
virtual const char* what() const throw ()
{
cout << "MyException - what" << endl;
return m_msg.c_str();
}
const string m_msg;
};
void throwDerivedException()
{
cout << "throwDerivedException - thrown a derived exception" << endl;
string execptionMessage("MyException thrown");
throw (MyException(execptionMessage));
}
void illustrateDerivedExceptionCatch()
{
cout << "illustrateDerivedExceptionsCatch - start" << endl;
try
{
throwDerivedException();
}
catch (const exception& e)
{
cout << "illustrateDerivedExceptionsCatch - caught an std::exception, e.what:" << e.what() << endl;
// some additional code due to the fact that std::exception was thrown...
}
catch(const MyException& e)
{
cout << "illustrateDerivedExceptionsCatch - caught an MyException, e.what::" << e.what() << endl;
// some additional code due to the fact that MyException was thrown...
}
cout << "illustrateDerivedExceptionsCatch - end" << endl;
}
int main(int argc, char** argv)
{
cout << "main - start" << endl;
illustrateDerivedExceptionCatch();
cout << "main - end" << endl;
return 0;
}
বিঃদ্রঃ:
0) যথাযথ ক্রমটি বিপরীত হওয়া উচিত, অর্থাত্ প্রথমে আপনাকে catch (const MyException& e)
অনুসরণ করা হবে catch (const std::exception& e)
।
1) যেহেতু আপনি দেখতে পারেন, আপনি যখন প্রোগ্রাম চালানো হয়, প্রথম ধরা দফা মৃত্যুদন্ড কার্যকর করা হবে (যা সম্ভবত তুমি কি করেছিলে না প্রথম স্থানে চেয়েছিলেন)।
2) প্রথম ধরণের ধরণের ধরণের ধরণটি টাইপের হলেও std::exception
, "যথাযথ" সংস্করণটি what()
বলা হবে - কারণ এটি রেফারেন্সের মাধ্যমে ধরা পড়ে (কমপক্ষে ধরা পড়া যুক্তির std::exception
ধরণটি মান অনুসারে পরিবর্তন করুন - এবং আপনি অভিজ্ঞতাটি অনুভব করবেন) ক্রিয়াকলাপে "বস্তু কাটা" ঘটনা)।
3) "ব্যতিক্রমের কারণে XXX ব্যতিক্রম ছুঁড়ে ফেলার কারণে" কিছু কোড ... "ব্যতিক্রম প্রসঙ্গে শ্রদ্ধার সাথে গুরুত্বপূর্ণ জিনিসগুলি করে, আপনার কোডটির এখানে দুর্ব্যবহার রয়েছে।
৪) ধরা পড়া বস্তুগুলি যেমন "নরমাল" অবজেক্টের মতো হয়: class Base{};
এবং class Derived : public Base {}
...
5) g++ 7.3.0
উবুন্টু 18.04.1 এ একটি সতর্কতা উত্পন্ন করে যা উল্লিখিত সমস্যাটিকে নির্দেশ করে:
ফাংশনে 'অকার্যকর ইলাস্ট্রেটডেরাইভেড এক্সেকশন ক্যাচ ()': আইটেম 12 লিনাক্স সিপিপি: 48: 2: সতর্কতা: 'মাই এক্সেক্সপশন' টাইপ ব্যতীত ধরা পড়বে (কন মাই এক্সেক্সপশন এবং ই) ^ ~~~~
আইটেম 12 লিনাকস সিপিপি: 43: 2: সতর্কতা: 'স্টাড :: ব্যতিক্রম'
ক্যাচ (কনস্ট্যান্ড ব্যতিক্রম এবং ই) এর আগের হ্যান্ডলার দ্বারা ^ warning
আবার , আমি এই উত্তর শুধুমাত্র হয় বলবে, এডিডি অন্যান্য উত্তর এখানে বর্ণিত (আমি এই বিন্দু মূল্য উল্লেখ করা হয়, এখনো একটি মন্তব্য মধ্যেই বর্ণা না পারে)।