রিলিজ বিল্ডগুলির কার্যকারিতা প্রভাবিত না করে ডিবাগিং সহজ করার জন্য আমি আমার সি ++ কোডে প্রচুর পরিমাণ যুক্তি যুক্ত করার প্রবণতা রাখি। এখন, assert
সি ++ প্রক্রিয়াগুলি মাথায় না রেখে একটি খাঁটি সি ম্যাক্রো।
অন্যদিকে সি ++ সংজ্ঞায়িত করে std::logic_error
, যার অর্থ প্রোগ্রামের যুক্তিতে কোনও ত্রুটি রয়েছে (তাই নাম) cases উদাহরণ নিক্ষেপ করা কেবলমাত্র নিখুঁত, আরও সি ++ ইশ বিকল্প হতে পারে assert
।
সমস্যাটি হ'ল assert
এবং abort
উভয়ই ডেস্ট্রাক্টরদের কল না করেই প্রোগ্রামটি তত্ক্ষণাত বন্ধ করে দেন, সুতরাং ক্লিনআপটি এড়িয়ে যান, অন্যদিকে ম্যানুয়ালি একটি ব্যতিক্রম নিক্ষেপ করা অপ্রয়োজনীয় রানটাইম ব্যয়কে যুক্ত করে। এর চারপাশে একটি উপায় একটি নিজস্ব দৃser় ম্যাক্রো তৈরি করবে SAFE_ASSERT
, যা কেবল সি পালকের মতো কাজ করে তবে ব্যর্থতার ক্ষেত্রে ব্যতিক্রম ছুঁড়ে ফেলে।
এই সমস্যা সম্পর্কে আমি তিনটি মতামত ভাবতে পারি:
- সি এর দৃ to়তার সাথে লেগে থাকুন। যেহেতু প্রোগ্রামটি তত্ক্ষণাত বন্ধ হয়ে গেছে, পরিবর্তনগুলি সঠিকভাবে তালিকাভুক্ত করা হয়েছে কিনা তা বিবেচ্য নয়। এছাড়াও,
#define
সি ++ তে এস ব্যবহার করা ঠিক ততটাই খারাপ। - একটি ব্যতিক্রম নিক্ষেপ করুন এবং এটি মূল () তে ধরুন । প্রোগ্রামের কোনও রাজ্যে ডেস্ট্রাক্টরদের এড়িয়ে যাওয়ার কোডকে দেওয়া খারাপ অভ্যাস এবং এটি সর্বদা এড়ানো উচিত এবং তাই () সমাপ্ত করার জন্য কলগুলিও রয়েছে। যদি ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে তাদের অবশ্যই ধরা পড়বে।
- একটি ব্যতিক্রম নিক্ষেপ করুন এবং এটি প্রোগ্রামটি শেষ করতে দিন। কোনও প্রোগ্রামের সমাপ্তি ব্যতিক্রম ঠিক আছে, এবং এর কারণে
NDEBUG
এটি কোনও রিলিজ বিল্ডে কখনও ঘটবে না। ক্যাচিং অপ্রয়োজনীয় এবং অভ্যন্তরীণ কোডটির বাস্তবায়ন বিশদটি প্রকাশ করেmain()
।
এই সমস্যার একটি নির্দিষ্ট উত্তর আছে? কোন পেশাদার রেফারেন্স?
সম্পাদিত: এড়িয়ে যাওয়া ধ্বংসকারীরা অবশ্যই কোনও অপরিজ্ঞাত আচরণ নয়।
logic_error
লজিক ত্রুটি। প্রোগ্রামটির যুক্তিতে একটি ত্রুটি বলা হয় একটি বাগ। আপনি ব্যতিক্রম ছুঁড়ে দিয়ে বাগ সমাধান করবেন না।