আমার কি স্ট্যান্ড :: ব্যতিক্রম হতে হবে?


99

আমি কমপক্ষে একটি নির্ভরযোগ্য উত্স দেখেছি (একটি সি ++ শ্রেণি আমি নিয়েছি) সুপারিশ করে যে C ++ এ অ্যাপ্লিকেশন-নির্দিষ্ট ব্যতিক্রম শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত হওয়া উচিত std::exception। আমি এই পদ্ধতির সুবিধা সম্পর্কে পরিষ্কার নই।

সি # তে উত্তরাধিকার সূত্রে প্রাপ্ত কারণগুলি ApplicationExceptionস্পষ্ট: আপনি হাতে গোনা কয়েকটি দরকারী পদ্ধতি, বৈশিষ্ট্য এবং নির্মাতা পেয়েছেন এবং আপনার যা প্রয়োজন তা যুক্ত করতে বা ওভাররাইড করতে হবে। সঙ্গে std::exceptionমনে হয় সবারই আপনি পেতে একটি যে what()আপনি ঠিক যেমন ভাল নিজেকে তৈরী করতে পারে ওভাররাইড করতে পদ্ধতি।

তাহলে std::exceptionআমার অ্যাপ্লিকেশন-নির্দিষ্ট ব্যতিক্রম শ্রেণীর জন্য বেস বর্গ হিসাবে ব্যবহারের সুবিধাগুলি, যদি কোনও হয় ? উত্তরাধিকারসূত্রে না পাওয়ার কোনও ভাল কারণ আছে std::exceptionকি?


আপনি এটি দেখতে চান: স্ট্যাকওভারফ্লো
এসবিআই

4
যদিও সাইড নোট নির্দিষ্ট প্রশ্নের সাথে সম্পর্কিত নয়, আপনার নেওয়া সি ++ ক্লাসগুলি কেবল তাদের নিজস্ব অধিকারের বাইরে ভাল অভ্যাসের নির্ভরযোগ্য উত্স হওয়ার দরকার নেই।
খ্রিস্টান রাউ

উত্তর:


69

প্রধান সুবিধাটি হ'ল আপনার ক্লাসগুলি ব্যবহার করে কোডটি আপনাকে কী ধরণের তা সঠিক ধরণের জানতে throwহবে না, তবে কেবল catchএটি করতে পারে std::exception

সম্পাদনা করুন: মার্টিন এবং অন্যরা যেমন উল্লেখ করেছেন, আপনি আসলে শিরোনামে std::exceptionঘোষিত সাব-ক্লাসগুলির মধ্যে একটি থেকে পেতে চান <stdexcept>


21
স্ট্যান্ড :: ব্যতিক্রম কোনও বার্তা পাস করার উপায় নেই। std :: রানটাইম_অরার একটি স্ট্রিং গ্রহণ করে এবং স্ট্যান্ড :: ব্যতিক্রম থেকে প্রাপ্ত।
মার্টিন ইয়র্ক

14
আপনি ব্যতিক্রম প্রকারের কনস্ট্রাক্টরের কাছে কোনও বার্তা প্রেরণ করা উচিত নয় (বিবেচনা করুন যে বার্তাগুলি স্থানীয়করণ করা দরকার Instead) পরিবর্তে, ব্যতিক্রমের সংজ্ঞা নির্ধারণ করুন যা ত্রুটিটিকে শব্দার্থভাবে শ্রেণিবদ্ধ করে, ব্যাক্তি-বান্ধব বার্তায় আপনাকে কী ফর্ম্যাট করতে হবে সেই ব্যতিক্রম বস্তুতে সংরক্ষণ করুন , তাহলে ক্যাচ সাইটে এমন করুন।
এমিল

std::exceptionহয় সংজ্ঞায়িত মধ্যে <exception>হেডার ( প্রমাণ )। -1
আলেকজান্ডার শুকায়েভ

5
তাহলে আপনার বক্তব্য কি? সংজ্ঞা ঘোষণাকে বোঝায়, আপনি এখানে কী ভুল হতে দেখছেন?
নিকোলাই ফেটিসসোভ

40

সমস্যাটি std::exceptionহ'ল এমন কোনও কনস্ট্রাক্টর নেই (মান সম্মত সংস্করণে) যা কোনও বার্তা গ্রহণ করে।

ফলস্বরূপ আমি থেকে প্রাপ্ত পছন্দ std::runtime_error। এটি থেকে উদ্ভূত হয়েছে std::exceptionতবে এর নির্মাতারা আপনাকে সি-স্ট্রিং বা std::stringকনস্ট্রাক্টরকে একটি পাস করার অনুমতি দেয় যা কল করার পরে ফিরে আসবে (ক char const*) what()


11
নিক্ষেপ করার সময় কোনও ব্যবহারকারী-বান্ধব বার্তাটি ফর্ম্যাট করা ভাল ধারণা নয় কারণ এটি স্থানীয়করণ কার্যকারিতা এবং হোয়াট নোট সহ নিম্ন স্তরের কোডটি তৈরি করবে would পরিবর্তে, ব্যতিক্রমী সমস্ত প্রাসঙ্গিক তথ্য অবজেক্ট করুন এবং ক্যাচ সাইটের ব্যতিক্রম প্রকার এবং এটি বহন করে এমন ডেটার উপর ভিত্তি করে ব্যবহারকারী-বান্ধব বার্তাটি ফর্ম্যাট করতে দিন।
এমিল

16
@ এমিল: অবশ্যই যদি আপনি ব্যতিক্রম ব্যবহারকারী প্রদর্শনযোগ্য বার্তাগুলি বহন করেন তবে সাধারণত সেগুলি শুধুমাত্র লগিংয়ের উদ্দেশ্যে। নিক্ষেপ সাইটে আপনার ব্যবহারকারীর বার্তা তৈরি করার প্রসঙ্গটি নেই (কারণ এটি কোনওভাবেই একটি লাইব্রেরি হতে পারে)। ক্যাচ সাইটে আরও প্রসঙ্গ থাকবে এবং উপযুক্ত চিত্রটি উত্পন্ন করতে পারে।
মার্টিন ইয়র্ক

4
আমি জানি না আপনি কোথায় এই ধারণাটি পেয়েছেন যে ব্যতিক্রমগুলি কেবল লগিংয়ের উদ্দেশ্যে are :)
এমিল

4
@ এমিল: আমরা ইতিমধ্যে এই যুক্তিটি পেরিয়েছি। যেখানে আমি উল্লেখ করেছি যে আপনি ব্যতিক্রমটি এটাই রাখছেন না। আপনি বিষয়টি বোঝা ভাল মনে হলেও আপনার যুক্তি ত্রুটিযুক্ত। ব্যবহারকারীর জন্য উত্পন্ন ত্রুটি বার্তাগুলি বিকাশকারীর জন্য লগ বার্তাগুলি থেকে সম্পূর্ণ পৃথক।
মার্টিন ইয়র্ক

4
এমিল এই আলোচনাটি এক বছরের পুরনো। এই মুহুর্তে আপনার নিজের প্রশ্ন তৈরি করুন। যতদূর আমি উদ্বিগ্ন আপনার যুক্তিগুলি কেবলমাত্র ভুল (এবং ভোটের ভিত্তিতে লোকেরা আমার সাথে একমত হতে চায়)। দেখুন ব্যতিক্রম একটি 'ভাল নম্বর আমার লাইব্রেরির জন্য বাস্তবায়ন কি? এবং সাধারণ ব্যতিক্রমগুলি ধরা কি আসলেই একটি খারাপ জিনিস? আপনি আপনার পূর্ববর্তী ডায়রিটিব থেকে কোনও নতুন তথ্য সরবরাহ করেন নি।
মার্টিন ইয়র্ক

17

এর উত্তরাধিকার সূত্রে প্রাপ্ত কারণগুলি std::exceptionব্যতিক্রমগুলির জন্য এটি "স্ট্যান্ডার্ড" বেস ক্লাস, সুতরাং কোনও দলের অন্যান্য লোকদের পক্ষে উদাহরণস্বরূপ, এটি আশা করা এবং বেসটি ধরা স্বাভাবিক std::exception

আপনি যদি সুবিধার্থে সন্ধান করছেন তবে আপনি std::runtime_errorসেই std::stringনির্মাণকারীর কাছ থেকে উত্তরাধিকারী হতে পারেন ।


4
স্ট্যান্ড :: ব্যতিক্রম ব্যতীত অন্য কোনও স্ট্যান্ডার্ড ব্যতিক্রম প্রকারের তথ্য সংগ্রহ করা সম্ভবত ভাল ধারণা নয়। সমস্যাটি হ'ল তারা স্ট্যান্ড :: ব্যতিক্রমহীনভাবে ব্যতিক্রম থেকে প্রাপ্ত, যা একাধিক উত্তরাধিকারের সাথে জড়িত সূক্ষ্ম বাগের দিকে পরিচালিত করতে পারে যেখানে একটি ক্যাচ (স্ট্যান্ড :: ব্যতিক্রম &) স্ট্যান্ড রুপান্তরিত হওয়ার কারণে চুপচাপ একটি ব্যতিক্রম ধরা ব্যর্থ হতে পারে :: ব্যতিক্রম অনিশ্চিত.
এমিল

4
আমি এই বিষয়টিতে বুস্ট করার নিবন্ধটি পড়েছি। খাঁটি যুক্তিযুক্ত অর্থে এটি যুক্তিসঙ্গত বলে মনে হয়। তবে বন্যের তুলনায় আমি কখনও এমএইচ দেখিনি। আমিও ব্যতিক্রমগুলিতে এমএইচ ব্যবহার করার বিষয়টি বিবেচনা করব না তাই এটি অস্তিত্বহীন সমস্যা সমাধানের জন্য স্লেজহ্যামারের মতো বলে মনে হচ্ছে। এটি যদি আসল সমস্যা হত তবে আমি নিশ্চিত যে আমরা এরকম একটি স্পষ্ট ত্রুটি সমাধানের জন্য স্ট্যান্ডার্ড কমিটি থেকে এর উপর পদক্ষেপ নিতে দেখেছি। সুতরাং আমার অভিমত হল যে স্ট্যান্ড :: রানটাইম_অরর (এবং পরিবার) এখনও ফেলে দেওয়া বা নেওয়া থেকে নিখুঁতভাবে গ্রহণযোগ্য ব্যতিক্রম।
মার্টিন ইয়র্ক

5
@ এমিল: এ ছাড়া অন্যান্য মানক ব্যতিক্রমগুলি থেকে বের std::exceptionহওয়া একটি দুর্দান্ত ধারণা। আপনি কি করা উচিত নয় থেকে উত্তরাধিকারী হয় আরো একাধিক।
মাকিং হাঁস

@ মুভিংডাক: আপনি যদি একাধিক স্ট্যান্ডার্ড ব্যতিক্রম প্রকারের থেকে উদ্ভূত হন তবে আপনি স্ট্যান্ড :: ব্যতিক্রম একাধিকবার (অ-ভার্চুয়ালি) প্রাপ্ত হওয়ার সাথে শেষ করবেন। Boost.org/doc/libs/release/libs/exception/doc/… দেখুন ।
এমিল

4
@ এমিল: এটি আমি যা বলেছিলাম তার থেকে অনুসরণ করে।
মাকিং হাঁস

13

আমি একবার একটি বৃহত কোডবেজ সাফ করার অংশ নিয়েছিলাম যেখানে পূর্ববর্তী লেখকরা ইনট, এইচআরইলস্টস, স্ট্যান্ড :: স্ট্রিং, চর *, এলোমেলো ক্লাস ... সর্বত্র বিভিন্ন স্টাফ ফেলেছিল; কেবল একটি প্রকারের নাম দিন এবং এটি সম্ভবত কোথাও ছুঁড়ে দেওয়া হয়েছিল। এবং কোনও সাধারণ বেস শ্রেণি নেই। বিশ্বাস করুন, জিনিসগুলি তখন অনেক পরিপাটি হয়ে ওঠে যখন আমরা ফেলেছি যে সমস্ত নিক্ষিপ্ত ধরণের একটি সাধারণ ভিত্তি রয়েছে যা আমরা ধরতে পারি এবং জানতাম যে কিছুই অতীত হতে চলেছে। সুতরাং দয়া করে নিজেকে করুন (এবং ভবিষ্যতে যাদের আপনার কোডটি বজায় রাখতে হবে) একটি অনুগ্রহ করুন এবং শুরু থেকেই সেভাবে করুন।


12

আপনার বুস্ট :: ব্যতিক্রম থেকে উত্তরাধিকারী হওয়া উচিত । এটি অতিরিক্ত ডেটা বহন করার জন্য আরও অনেকগুলি বৈশিষ্ট্য এবং ভাল বোঝার উপায় সরবরাহ করে ... অবশ্যই আপনি যদি বুস্ট ব্যবহার না করেন তবে এই পরামর্শটিকে উপেক্ষা করুন।


5
তবে উল্লেখ্য যে বুস্ট :: ব্যতিক্রম নিজেই স্ট্যান্ড :: ব্যতিক্রম থেকে প্রাপ্ত নয়। এমনকি বুস্ট :: ব্যতিক্রম থেকে উদ্ভূত হওয়ার সময় আপনার স্টাড :: ব্যতিক্রম থেকেও নেওয়া উচিত (পৃথক নোট হিসাবে যখনই ব্যতিক্রমের ধরণ থেকে প্রাপ্ত হয়, আপনার ভার্চুয়াল উত্তরাধিকার ব্যবহার করা উচিত))
এমিল

10

হ্যাঁ আপনি থেকে প্রাপ্ত করা উচিত std::exception

অন্যরা উত্তর দিয়েছে যে std::exceptionএতে আপনার সমস্যা আছে যে আপনি এটিতে কোনও পাঠ্য বার্তা পাঠাতে পারবেন না, তবে নিক্ষেপের সময় কোনও ব্যবহারকারী বার্তা ফর্ম্যাট করার চেষ্টা করা সাধারণত ভাল ধারণা নয়। পরিবর্তে, ক্যাচ সাইটে সমস্ত প্রাসঙ্গিক তথ্য পরিবহনের জন্য ব্যতিক্রম বস্তুটি ব্যবহার করুন যা ব্যবহারকারী-বান্ধব বার্তার ফর্ম্যাট করতে পারে।


6
+1, ভাল পয়েন্ট। উদ্বেগের বিচ্ছেদ এবং আই 18n দৃষ্টিকোণ উভয়ই, উপস্থাপনা স্তরটি ব্যবহারকারী বার্তাটি তৈরি করা অবশ্যই ভাল better
জন এম গ্যান্ট

@ জন এমএমএ্যান্ট এবং এমিল: আকর্ষণীয়, কীভাবে এটি করা যায় তার একটি দৃ you় উদাহরণ আপনি তুলে ধরতে পারেন? আমি বুঝতে পারি যে কেউ std::exceptionব্যতিক্রমের তথ্য গ্রহণ এবং বহন করতে পারে । তবে ত্রুটি বার্তাটি তৈরি / ফর্ম্যাট করার জন্য কে দায়বদ্ধ হবে? ::what()ফাংশন বা অন্য কিছু?
alfC

4
আপনি বার্তাটিকে ক্যাচ সাইটে বিন্যাস করতে চান, সম্ভবত অ্যাপ্লিকেশনটির (লাইব্রেরির চেয়ে) স্তরে likely আপনি এটি টাইপ করে ধরেন, তারপরে তথ্যের জন্য এটি অনুসন্ধান করুন, তারপরে উপযুক্ত ব্যবহারকারী বার্তাকে স্থানীয়করণ / ফর্ম্যাট করুন।
এমিল

9

আপনি যে কারণে উত্তরাধিকারী হতে চাইতে পারেন তা std::exceptionহ'ল কারণ এটি আপনাকে সেই শ্রেণি অনুসারে ধরা পড়ে এমন একটি ব্যতিক্রম ছুঁড়ে ফেলতে দেয়, যেমন:

class myException : public std::exception { ... };
try {
    ...
    throw myException();
}
catch (std::exception &theException) {
    ...
}

6

উত্তরাধিকার নিয়ে একটি সমস্যা রয়েছে যা সম্পর্কে আপনার জানা উচিত অবজেক্ট স্লাইসিং। যখন আপনি লিখতে throw e;একটি থ্রো প্রকাশ একটি অস্থায়ী বস্তুর সূচনা, ব্যতিক্রম বস্তু, যার ধরনের প্রতীক স্ট্যাটিক টাইপ থেকে কোন টপ লেভেল CV-কোয়ালিফায়ার সরানোর দ্বারা নির্ধারিত হয় নামক throw। আপনি যা আশা করছেন তা তা হতে পারে না। সমস্যাটির উদাহরণ আপনি এখানে পেতে পারেন ।

এটি উত্তরাধিকারের বিরুদ্ধে কোন যুক্তি নয়, এটি কেবল 'অবশ্যই জানা উচিত' তথ্য।


4
আমি মনে করি এটি হ'ল "ই ই নিক্ষেপ;" মন্দ, এবং "নিক্ষেপ;" ঠিক আছে
জেমস শেক

4
হ্যাঁ, throw;ঠিক আছে, তবে আপনার এমন কিছু লেখার বিষয়টি স্পষ্ট নয়।
কিরিল ভি লিয়াডভিনস্কি

4
এটি জাভা বিকাশকারীদের জন্য বিশেষত বেদনাদায়ক যেখানে "থ্রো ই" ব্যবহার করে পুনর্নবীকরণ করা হয়;
জেমস শেক 22

শুধুমাত্র বিমূর্ত বেস ধরণের থেকে প্রাপ্ত বিবেচনা করুন। মান অনুসারে একটি বিমূর্ত বেস টাইপ করা আপনাকে একটি ত্রুটি দেয় (কাটা এড়ানো); রেফারেন্স অনুসারে একটি বিমূর্ত বেস টাইপ করা এবং এর অনুলিপিটি ছুঁড়ে দেওয়ার চেষ্টা করা আপনাকে একটি ত্রুটি দেয় (আবার স্লাইসিং এড়ানো)
এমিল

এছাড়াও আপনি একটি সদস্য ফাংশন, যোগ করে এই সমস্যা সমাধান করতে পারে raise(), যেমন: virtual void raise() { throw *this; }। প্রতিটি উত্পন্ন ব্যতিক্রম এটিকে ওভাররাইড করতে কেবল মনে রাখবেন।
জাস্টিন সময় - মনিকা পুনরায় স্থাপন করুন

5

পার্থক্য: স্টাড :: রানটাইম_অরর বনাম স্টাড :: ব্যতিক্রম ()

আপনার এর উত্তরাধিকারী হওয়া উচিত কিনা তা আপনার উপর নির্ভর করে। স্ট্যান্ডার্ড std::exceptionএবং এর মান বংশধররা একটি সম্ভাব্য ব্যতিক্রম শ্রেণিবদ্ধ কাঠামো ( logic_errorsubhierarchy এবং runtime_errorsubhierarchy মধ্যে বিভাগ) এবং একটি সম্ভাব্য ব্যতিক্রম অবজেক্ট ইন্টারফেস প্রস্তাব করে। আপনি যদি এটি পছন্দ করেন - এটি ব্যবহার করুন। যদি কোনও কারণে আপনার আলাদা কিছু প্রয়োজন হয় - আপনার নিজস্ব ব্যতিক্রম কাঠামোটি সংজ্ঞায়িত করুন।


3

যেহেতু ভাষা ইতিমধ্যে স্টাড :: ব্যতিক্রম ছুঁড়েছে, তাই আপনাকে শালীন ত্রুটি প্রতিবেদন সরবরাহ করার জন্য এটি যেভাবেই ধরতে হবে। আপনি একই নিজস্বটিকে সমস্ত অপ্রত্যাশিত ব্যতিক্রমগুলির জন্য একই ক্যাচটি ব্যবহার করতে পারেন। এছাড়াও, প্রায় কোনও লাইব্রেরি যে ব্যতিক্রম ছুঁড়েছিল সেগুলি তাদের স্টাড :: ব্যতিক্রম থেকে প্রাপ্ত করবে।

অন্য কথায়, এটি হয়

catch (...) {cout << "Unknown exception"; }

বা

catch (const std::exception &e) { cout << "unexpected exception " << e.what();}

এবং দ্বিতীয় বিকল্পটি অবশ্যই ভাল।


3

যদি আপনার সমস্ত সম্ভাব্য ব্যতিক্রম থেকে উদ্ভূত হয় তবে std::exceptionআপনার ক্যাচ ব্লকটি সহজভাবে catch(std::exception & e)এবং সমস্ত কিছু ক্যাপচারের আশ্বাস দিতে পারে।

একবার আপনি ব্যতিক্রম ক্যাপচার হয়ে গেলে, আপনি whatআরও তথ্য পাওয়ার জন্য এই পদ্ধতিটি ব্যবহার করতে পারেন । সি ++ হাঁস-টাইপিং সমর্থন করে না, সুতরাং একটি whatপদ্ধতি সহ অন্য শ্রেণীর জন্য এটি ব্যবহারের জন্য আলাদা ক্যাচ এবং আলাদা কোডের প্রয়োজন হবে।


7
স্টাডি :: ব্যতিক্রম সাবক্লাস করবেন না এবং তারপরে (স্ট্যান্ড :: ব্যতিক্রম ই) ধরুন। আপনাকে স্ট্যান্ড :: ব্যতিক্রম & (বা একটি পয়েন্টার) এর একটি রেফারেন্স ধরতে হবে অথবা অন্যথায় আপনি সাবক্লাসের ডেটা স্লাইস করছেন।
jmucchiello

4
এখন এটি একটি বোবা ভুল ছিল - অবশ্যই আমি আরও ভাল জানি। stackoverflow.com/questions/1095225/…
মার্ক র্যানসোম

3

কোনও মান ব্যতিক্রম প্রকার থেকে প্রাপ্ত কিনা তা প্রথম প্রশ্ন। এটি করা সমস্ত স্ট্যান্ডার্ড লাইব্রেরি ব্যতিক্রম এবং আপনার নিজস্বগুলির জন্য একক ব্যতিক্রম হ্যান্ডলারকে সক্ষম করে, তবে এটি এই ধরণের ক্যাচ-ও-সমস্ত হ্যান্ডলারদেরও উত্সাহ দেয়। সমস্যাটি হ'ল একজনকে কেবল ব্যতিক্রমগুলি ধরা উচিত যা কীভাবে পরিচালনা করতে হয় knows মূল (), উদাহরণস্বরূপ, সমস্ত স্ট্যান্ড :: ব্যতিক্রম ধরা খুব ভাল জিনিস যদি কোন () স্ট্রিংটি প্রস্থান করার আগে একটি শেষ অবলম্বন হিসাবে লগইন করা হয়। অন্য কোথাও, এটি ভাল ধারণা হওয়ার সম্ভাবনা কম।

একবার আপনি সিদ্ধান্ত নিয়েছেন যে কোনও স্ট্যান্ডার্ড ব্যতিক্রম প্রকার থেকে প্রাপ্ত হবে কি না, তারপরে প্রশ্নটি কোনটি বেস হওয়া উচিত। যদি আপনার অ্যাপ্লিকেশনটির আইআইএনএন প্রয়োজন হয় না, আপনি মনে করতে পারেন যে কল সাইটে কোনও বার্তা ফর্ম্যাট করা তথ্য সংরক্ষণ এবং কল সাইটে বার্তাটি উত্পন্ন করার মতোই দুর্দান্ত। সমস্যাটি হ'ল ফর্ম্যাট বার্তাটির প্রয়োজন নাও হতে পারে। একটি অলস বার্তা জেনারেশন স্কিম ব্যবহার করা ভাল - সম্ভবত বদ্ধ মেমোরি সহ। তারপরে, যদি বার্তাটির প্রয়োজন হয় তবে এটি অ্যাক্সেসে উত্পন্ন হবে (এবং সম্ভবত, ব্যতিক্রম বস্তুতে ক্যাশে)। সুতরাং, যদি বার্তাটি নিক্ষেপ করার সময় উত্পন্ন হয় তবে বেস শ্রেণি হিসাবে স্ট্যান্ড :: রানটাইম_আররের মতো একটি স্ট্যান্ড :: ব্যতিক্রম ডেরাইভেট। যদি বার্তাটি অলসভাবে উত্পন্ন হয় তবে std :: ব্যতিক্রমটি উপযুক্ত বেস।


0

বৃহত এনক্যাপসুলেটেড সিস্টেমে কাজ করার সময় উপ-শ্রেণীর ব্যতিক্রমগুলির আরেকটি কারণ হ'ল একটি আরও ভাল ডিজাইনের দিক। আপনি বৈধতা বার্তা, ব্যবহারকারী জিজ্ঞাসা, মারাত্মক নিয়ামক ত্রুটি ইত্যাদির মতো জিনিসগুলির জন্য এটি পুনরায় ব্যবহার করতে পারেন। বার্তাগুলির মতো আপনার সমস্ত বৈধতা পুনরায় লেখার বা পুনরায় লেখার চেয়ে আপনি এটিকে মূল উত্স ফাইলে কেবল "ধরা" দিতে পারেন, তবে ত্রুটিটি আপনার ক্লাসের পুরো সেটটিতে যে কোনও জায়গায় ফেলে দিতে পারেন।

উদাহরণস্বরূপ একটি মারাত্মক ব্যতিক্রম প্রোগ্রামটি শেষ করে দেবে, একটি বৈধতা ত্রুটি কেবল স্ট্যাক সাফ করবে এবং একটি ব্যবহারকারী ক্যোয়ারী শেষ ব্যবহারকারীকে একটি প্রশ্ন জিজ্ঞাসা করবে।

এটি এভাবে করার অর্থ আপনি একই ক্লাসগুলি পুনরায় ব্যবহার করতে পারবেন তবে বিভিন্ন ইন্টারফেসে। উদাহরণস্বরূপ একটি উইন্ডোজ অ্যাপ্লিকেশন বার্তা বাক্স ব্যবহার করতে পারে, একটি ওয়েব পরিষেবা এইচটিএমএল প্রদর্শন করবে এবং রিপোর্টিং সিস্টেম এটি লগ করবে এবং এইভাবেই।


0

যদিও এই প্রশ্নটি বরং পুরানো এবং ইতিমধ্যে যথেষ্ট পরিমাণে জবাব দেওয়া হয়েছে, আমি কেবলমাত্র সি ++ 11 এ কীভাবে সঠিক ব্যতিক্রম পরিচালনা করতে হবে তার একটি নোট যুক্ত করতে চাই, যেহেতু ব্যতিক্রম সম্পর্কে আলোচনায় আমি ক্রমাগত এটিকে অনুপস্থিত:

ব্যবহার করুন std::nested_exceptionএবংstd::throw_with_nested

এটি স্ট্যাকওভারফ্লোতে এখানে এবং এখানে বর্ণিত হয়েছে , কীভাবে আপনি আপনার ব্যাতিক্রমগুলিতে ব্যাকট্রেস পেতে পারেন কোনও ডিবাগার বা কষ্টকর লগিংয়ের প্রয়োজন ছাড়াই আপনার কোডের অভ্যন্তরে , কেবলমাত্র একটি উপযুক্ত ব্যতিক্রম হ্যান্ডলার লিখে যা নেস্টেড ব্যতিক্রমগুলি পুনর্বিবেচনা করবে।

যেহেতু আপনি যে কোনও উদ্ভূত ব্যতিক্রম শ্রেণি দিয়ে এটি করতে পারেন, আপনি এই জাতীয় ব্যাকট্রাসে প্রচুর তথ্য যুক্ত করতে পারেন! আপনি গিটহাবের আমার এমডব্লিউইতে একবার দেখে নিতে পারেন , যেখানে ব্যাকট্র্যাসটি এরকম কিছু দেখায়:

Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"

std::runtime_errorকোনও ব্যতিক্রম ছুঁড়ে ফেলা হলে প্রচুর তথ্য পাওয়ার জন্য আপনাকে এমনকি সাবক্লাসের প্রয়োজন নেই ।

সাবক্ল্যাসিংয়ে কেবলমাত্র উপকারটি দেখছি (কেবল ব্যবহারের পরিবর্তে std::runtime_error) এটি হ'ল আপনার ব্যতিক্রম হ্যান্ডলারটি আপনার কাস্টম ব্যতিক্রমটি ধরতে পারে এবং বিশেষ কিছু করতে পারে। উদাহরণ স্বরূপ:

try
{
  // something that may throw
}
catch( const MyException & ex )
{
  // do something specialized with the
  // additional info inside MyException
}
catch( const std::exception & ex )
{
  std::cerr << ex.what() << std::endl;
}
catch( ... )
{
  std::cerr << "unknown exception!" << std::endl;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.