আমার প্রথম 'সিরিয়াস' সি ++ লাইব্রেরি ডিজাইন করার সময়, আমি নিজেকে জিজ্ঞাসা করছি:
এর থেকে ব্যতিক্রম std::exception
এবং এটি অফস্প্রিংগুলি অর্জন করা কি ভাল স্টাইল ?!
পড়ার পরেও
আমি এখনও নিশ্চিত নই। কারণ, প্রচলিত (তবে সম্ভবত ভাল না) অনুশীলনের পাশাপাশি, আমি ধরে নেব, একটি গ্রন্থাগার ব্যবহারকারী হিসাবে, একটি গ্রন্থাগার ফাংশন std::exception
কেবল তখনই ছুঁড়ে ফেলা হয় যখন গ্রন্থাগার বাস্তবায়নে স্ট্যান্ডার্ড লাইব্রেরি ফাংশন ব্যর্থ হয়, এবং এটি এ সম্পর্কে কিছুই করতে পারে না। তবে তবুও, অ্যাপ্লিকেশন কোডটি লেখার সময়, আমার জন্য এটি খুব সুবিধাজনক এবং আইএমএইচওও কেবল একটি নিক্ষেপ করতে ভাল লাগছে std::runtime_error
। এছাড়াও আমার ব্যবহারকারীরাও নির্ধারিত সর্বনিম্ন ইন্টারফেসের মতো what()
বা কোডগুলিতে নির্ভর করতে পারেন ।
এবং উদাহরণস্বরূপ, আমার ব্যবহারকারী ত্রুটিযুক্ত যুক্তি সরবরাহ করে, একটি নিক্ষেপ করার চেয়ে আরও সুবিধাজনক আর কী হবে std::invalid_argument
, তাই না? সুতরাং স্ট্যান্ড :: ব্যতিক্রমের এখনও সাধারণ ব্যবহারের সাথে আমি অন্যের কোড দেখতে পাচ্ছি: কেন আরও এগিয়ে যান এবং আপনার কাস্টম ব্যতিক্রম শ্রেণি (যেমন: lib_foo_exception) এবং এর থেকে নেওয়া হয় না std::exception
।
থটস?
lib_foo_exception
ক্লাসটি এসেছে std::exception
, গ্রন্থাগার ব্যবহারকারী কেবল ধরা lib_foo_exception
দিয়ে ধরবে std::exception
, এছাড়াও যখন তিনি কেবল লিবারি ধরেন। সুতরাং আমি জিজ্ঞাসা করতে পারি আমার লাইব্রেরি ব্যতিক্রমের মূল শ্রেণিটি স্ট্যান্ড :: ব্যতিক্রম থেকে উত্তরাধিকার সূত্রে প্রাপ্ত ?
lib_foo_exception
?" থেকে inheriting সঙ্গে std::exception
আপনি এটা করে করতে পারেন catch(std::exception)
বা দ্বারা catch(lib_foo_exception)
। থেকে প্রাপ্ত না করে std::exception
, আপনি এটি যদি কেবল এবং কেবল যদি , দ্বারা ধরতেন catch(lib_foo_exception)
।
catch(...)
। এটি সেখানে রয়েছে কারণ ভাষাটি বিবেচনার ক্ষেত্রে (এবং "দুর্ব্যবহার" গ্রন্থাগারগুলির জন্য) অনুমতি দেয় তবে এটি আধুনিক সেরা অনুশীলন নয়।
catch
সাইট এবং একইভাবে মোটা লেনদেনকে উত্সাহিত করে যা ব্যবহারকারীর সমাপ্তির ক্রিয়াকলাপ model যদি আপনি এটিকে এমন ভাষাগুলির সাথে তুলনা করেন যা সাধারণ ধরার ধারণাটিকে উত্সাহ দেয় না std::exception&
, উদাহরণস্বরূপ, তাদের প্রায়শই try/catch
খুব নির্দিষ্ট ত্রুটিযুক্ত মধ্যস্থতাকারী ব্লকের সাথে অনেক বেশি কোড থাকে , যা ব্যতিক্রমী-হ্যান্ডলিংয়ের সাধারণতা কিছুটা কমিয়ে দেয় শুরু হওয়ার সাথে সাথে exception ম্যানুয়াল ত্রুটি পরিচালনার উপর এবং সম্ভবত যে সমস্ত পৃথক ত্রুটি ঘটতে পারে তার উপর অনেক বেশি জোর দেওয়া।
std::exception
অর্থ এই নয় যে আপনি একটি নিক্ষেপ করছেনstd::exception
। এছাড়াও, প্রথম স্থানstd::runtime_error
থেকে উত্তরাধিকারী হয়std::exception
, এবংwhat()
পদ্ধতিটি আসেstd::exception
, নাstd::runtime_error
। এবং জেনেরিক ব্যতিক্রম যেমন ছড়িয়ে দেওয়ার পরিবর্তে আপনার অবশ্যই নিজের ব্যতিক্রমী ক্লাসগুলি তৈরি করা উচিতstd::runtime_error
।