আপনার উভয় ব্যবহার করা উচিত। বিকাশকারী হিসাবে আপনার সুবিধার জন্য জোর দেওয়া। ব্যতিক্রমগুলি রানটাইম চলাকালীন যে জিনিসগুলি আপনি মিস করেছেন বা প্রত্যাশা করেননি সেগুলি ধরেন।
আমি সরল পুরানো দাবির পরিবর্তে গ্লিবের ত্রুটি প্রতিবেদন ফাংশনগুলির প্রতি আগ্রহী হয়েছি । তারা দৃ statements় বক্তব্যের মতো আচরণ করে তবে প্রোগ্রামটি থামানোর পরিবর্তে তারা কেবল একটি মূল্য ফেরত দেয় এবং প্রোগ্রামটি চালিয়ে যেতে দেয়। এটি আশ্চর্যজনকভাবে ভালভাবে কাজ করে, এবং একটি ফাংশন "এটি যা বলেছিল" ফিরে না আসে যখন আপনার বাকি প্রোগ্রামের কী হয় তা আপনি বোনাস হিসাবে দেখতে পাবেন। যদি এটি ক্র্যাশ হয়ে যায়, আপনি জানেন যে আপনার ত্রুটি পরীক্ষা করা রাস্তার অন্য কোথাও কোথাও কম।
আমার শেষ প্রজেক্টে, আমি পূর্ব শর্ত পরীক্ষা করে দেখাতে এই স্টাইলের ফাংশনগুলি ব্যবহার করেছি এবং যদি সেগুলির মধ্যে একটি ব্যর্থ হয় তবে আমি লগ ফাইলটিতে একটি স্ট্যাক ট্রেস প্রিন্ট করব তবে চালিয়ে যাব। আমার ডিবাগ বিল্ডটি চালানোর সময় অন্যান্য লোকেরা যখন কোনও সমস্যার মুখোমুখি হয় তখন আমার প্রচুর পরিমাণে ডিবাগিং সময় বাঁচায়।
#ifdef DEBUG
#define RETURN_IF_FAIL(expr) do { \
if (!(expr)) \
{ \
fprintf(stderr, \
"file %s: line %d (%s): precondition `%s' failed.", \
__FILE__, \
__LINE__, \
__PRETTY_FUNCTION__, \
#expr); \
::print_stack_trace(2); \
return; \
}; } while(0)
#define RETURN_VAL_IF_FAIL(expr, val) do { \
if (!(expr)) \
{ \
fprintf(stderr, \
"file %s: line %d (%s): precondition `%s' failed.", \
__FILE__, \
__LINE__, \
__PRETTY_FUNCTION__, \
#expr); \
::print_stack_trace(2); \
return val; \
}; } while(0)
#else
#define RETURN_IF_FAIL(expr)
#define RETURN_VAL_IF_FAIL(expr, val)
#endif
আমার যদি আর্গুমেন্টের রানটাইম চেকিংয়ের প্রয়োজন হয় তবে আমি এটি করতাম:
char *doSomething(char *ptr)
{
RETURN_VAL_IF_FAIL(ptr != NULL, NULL); // same as assert(ptr != NULL), but returns NULL if it fails.
// Goes away when debug off.
if( ptr != NULL )
{
...
}
return ptr;
}