কিছু ভাষার জন্য (অর্থাত সি ++) রিসোর্সেস ফাঁসের কোনও কারণ হওয়া উচিত নয়
সি ++ আরএআইআই ভিত্তিক।
যদি আপনার কাছে ব্যর্থ হতে পারে এমন কোড থাকে তবে ফিরে আসুন বা নিক্ষেপ করুন (এটি বেশিরভাগ সাধারণ কোড), তবে আপনার পয়েন্টারটি একটি স্মার্ট পয়েন্টারের ভিতরে আবৃত করা উচিত (ধরে নেওয়া আপনার স্ট্যাকের উপর আপনার অবজেক্টটি তৈরি না করার খুব যুক্তিসঙ্গত কারণ রয়েছে)।
রিটার্ন কোডগুলি আরও ভার্জোজ
এগুলি ভার্জোজ এবং এ জাতীয় কিছুতে বিকাশ ঘটে:
if(doSomething())
{
if(doSomethingElse())
{
if(doSomethingElseAgain())
{
// etc.
}
else
{
// react to failure of doSomethingElseAgain
}
}
else
{
// react to failure of doSomethingElse
}
}
else
{
// react to failure of doSomething
}
শেষ পর্যন্ত, আপনার কোডটি আইডেন্টেড নির্দেশিকাগুলির একটি সংগ্রহ (আমি উত্পাদন কোডে এই ধরণের কোড দেখেছি)।
এই কোডটি ভাল অনুবাদ করা যেতে পারে:
try
{
doSomething() ;
doSomethingElse() ;
doSomethingElseAgain() ;
}
catch(const SomethingException & e)
{
// react to failure of doSomething
}
catch(const SomethingElseException & e)
{
// react to failure of doSomethingElse
}
catch(const SomethingElseAgainException & e)
{
// react to failure of doSomethingElseAgain
}
কোনটি পরিচ্ছন্নভাবে আলাদা কোড এবং ত্রুটি প্রক্রিয়াকরণ, যা করতে পারেন একটি হতে ভাল জিনিস।
রিটার্ন কোডগুলি আরও ভঙ্গুর
যদি একটি সংকলক থেকে কিছু অস্পষ্ট সতর্কতা না হয় ("phjr" এর মন্তব্য দেখুন), তারা সহজেই উপেক্ষা করা যেতে পারে be
উপরের উদাহরণগুলির সাথে, ধরে নিন যে কেউ তার সম্ভাব্য ত্রুটিটি পরিচালনা করতে ভুলে যায় (এটি ঘটে ...)। "ফিরে" আসার পরে ত্রুটিটিকে উপেক্ষা করা হবে এবং সম্ভবত পরে বিস্ফোরণ হবে (অর্থাত্ একটি NULL পয়েন্টার)। ব্যতিক্রম ছাড়া একই সমস্যা ঘটবে না।
ত্রুটি উপেক্ষা করা হবে না। কখনও কখনও, আপনি এটি বিস্ফোরিত না হওয়া চাই, যদিও ... তাই আপনাকে অবশ্যই সাবধানে বেছে নিতে হবে।
রিটার্ন কোডগুলি কখনও কখনও অনুবাদ করা উচিত
ধরা যাক আমাদের নিম্নলিখিত ফাংশন রয়েছে:
- doSomething, যা NOT_FOUND_ERROR নামে পরিচিতি ফিরিয়ে আনতে পারে
- doSomethingElse, যা একটি বুল "মিথ্যা" ফিরিয়ে দিতে পারে (ব্যর্থতার জন্য)
- doSomeomingElseAgain, যা ত্রুটিযুক্ত বস্তুটি ফিরিয়ে দিতে পারে (__LINE__, __FILE__ এবং অর্ধেক স্ট্যাক ভেরিয়েবলের সাথে।
- সবকিছুর সাহায্যে doTryToDoSomethingWithAess, ভাল ... উপরের ফাংশনগুলি ব্যবহার করুন, এবং প্রকারের একটি ত্রুটি কোডটি ফিরিয়ে দিন ...
এটির ডাকা ফাংশনগুলির কোনও একটি ব্যর্থ হলে doTryToDoSomethingWithAllThisMess এর ফেরতের প্রকারটি কী?
রিটার্ন কোডগুলি সর্বজনীন সমাধান নয়
অপারেটররা একটি ত্রুটি কোড ফেরত দিতে পারে না। সি ++ কনস্ট্রাক্টরও পারবেন না।
রিটার্ন কোডগুলির অর্থ আপনি এক্সপ্রেশনগুলি চেইন করতে পারবেন না
উপরোক্ত পয়েন্টটির তাত্পর্যপূর্ণ। আমি যদি লিখতে চাই তবে কী হবে:
CMyType o = add(a, multiply(b, c)) ;
আমি পারছি না, কারণ রিটার্নের মান ইতিমধ্যে ব্যবহৃত (এবং কখনও কখনও এটি পরিবর্তন করা যায় না)। সুতরাং রিটার্ন মানটি প্রথম প্যারামিটারে পরিণত হয়, রেফারেন্স হিসাবে পাঠানো হয় ... না হয় not
ব্যতিক্রম টাইপ করা হয়
আপনি প্রতিটি ধরণের ব্যতিক্রমের জন্য বিভিন্ন ক্লাস পাঠাতে পারেন। রিসোর্সগুলি ব্যতিক্রম (যেমন স্মৃতি থেকে দূরে) হালকা হওয়া উচিত, তবে অন্য যে কোনও কিছুই প্রয়োজনীয় হিসাবে ভারী হতে পারে (আমি জাভা ব্যতিক্রম আমাকে পুরো স্ট্যাকটি দিচ্ছি)।
প্রতিটি ধরা পরে বিশেষজ্ঞ করা যেতে পারে।
পুনরায় নিক্ষেপ না করে কখনও ক্যাচ (...) ব্যবহার করবেন না
সাধারণত, আপনার কোনও ত্রুটি লুকানো উচিত নয়। আপনি যদি খুব কম সময়ে পুনরায় নিক্ষেপ না করেন তবে কোনও ফাইলটিতে ত্রুটিটি লগ করুন, একটি বার্তা বাক্স খুলুন, যাই হোক না কেন ...
ব্যতিক্রম হ'ল ... NUKE
ব্যতিক্রম সহ সমস্যাটি হ'ল তাদের অতিরিক্ত ব্যবহার করা চেষ্টা / ক্যাচের পূর্ণ কোড তৈরি করবে। তবে সমস্যাটি অন্য কোথাও: এসটিএল ধারক ব্যবহার করে তার কোডটি কে চেষ্টা করে / ধরবে? তবুও, এই পাত্রে একটি ব্যতিক্রম পাঠাতে পারেন।
অবশ্যই, সি ++ এ কোনও ব্যতিক্রমকে কখনও ডেস্ট্রাক্টর থেকে বেরিয়ে আসতে দেবেন না।
ব্যতিক্রমগুলি হ'ল ... সুসংগত
আপনার থ্রেডটি তার হাঁটুতে আনার আগে তাদের ধরার বিষয়ে নিশ্চিত হন বা আপনার উইন্ডোজ বার্তার লুপের ভিতরে প্রচার করুন।
সমাধান তাদের মিশ্রিত করা যেতে পারে?
সুতরাং আমি অনুমান করি যে সমাধানটি হ'ল যখন কিছু ঘটে না । এবং যখন কিছু ঘটতে পারে, তারপরে ব্যবহারকারীদের প্রতিক্রিয়া জানাতে সক্ষম করতে একটি রিটার্ন কোড বা প্যারামিটার ব্যবহার করুন।
সুতরাং, একমাত্র প্রশ্ন "এমন কি এমন কিছু যা ঘটেছিল না?"
এটি আপনার ফাংশনের চুক্তির উপর নির্ভর করে। যদি ফাংশনটি কোনও পয়েন্টার গ্রহণ করে, তবে পয়েন্টারটি অবশ্যই নন-নুল হতে হবে তা নির্দিষ্ট করে, তবে ব্যবহারকারী যখন একটি ন্যূনাল পয়েন্টার প্রেরণ করবে (প্রশ্নটি সি ++ এ রয়েছে, যখন ফাংশন লেখক পরিবর্তে রেফারেন্স ব্যবহার করেন নি) পয়েন্টারগুলির, তবে ...)
আরেকটি সমাধান হ'ল ত্রুটিটি দেখানো
কখনও কখনও, আপনার সমস্যা হ'ল আপনি ত্রুটি চান না। ব্যতিক্রম বা ত্রুটি রিটার্ন কোডগুলি ব্যবহার করা দুর্দান্ত তবে আপনি ... এটি সম্পর্কে জানতে চান।
আমার চাকরিতে, আমরা এক ধরণের "দৃsert়তা" ব্যবহার করি। এটি কোনও কনফিগারেশন ফাইলের মানগুলির উপর নির্ভর করে, ডিবাগ / রিলিজ সংকলনের বিকল্পগুলি বিবেচনা করে না:
- ত্রুটি লগ
- "আরে, আপনার সমস্যা আছে" দিয়ে একটি বার্তাবক্স খুলুন
- "আরে, আপনার সমস্যা আছে, আপনি কি ডিবাগ করতে চান" দিয়ে একটি বার্তাবক্স খুলুন
উভয় বিকাশ এবং পরীক্ষায়, এটি ব্যবহারকারীকে সমস্যাটি সনাক্ত করার সময় ঠিক চিহ্নিত করতে সক্ষম করে, এবং তার পরে নয় (যখন কোনও কোড রিটার্ন মান সম্পর্কে বা কোনও ক্যাচের অভ্যন্তরে যত্ন করে)।
উত্তরাধিকারের কোডটিতে যুক্ত করা সহজ। উদাহরণ স্বরূপ:
void doSomething(CMyObject * p, int iRandomData)
{
// etc.
}
এর মতো এক ধরণের কোড বাড়ে:
void doSomething(CMyObject * p, int iRandomData)
{
if(iRandomData < 32)
{
MY_RAISE_ERROR("Hey, iRandomData " << iRandomData << " is lesser than 32. Aborting processing") ;
return ;
}
if(p == NULL)
{
MY_RAISE_ERROR("Hey, p is NULL !\niRandomData is equal to " << iRandomData << ". Will throw.") ;
throw std::some_exception() ;
}
if(! p.is Ok())
{
MY_RAISE_ERROR("Hey, p is NOT Ok!\np is equal to " << p->toString() << ". Will try to continue anyway") ;
}
// etc.
}
(আমার কাছে একই ধরণের ম্যাক্রো রয়েছে যা কেবলমাত্র ডিবাগ-এ সক্রিয় থাকে)।
মনে রাখবেন যে উত্পাদনে কনফিগারেশন ফাইলটি বিদ্যমান নেই, তাই ক্লায়েন্ট কখনও এই ম্যাক্রোর ফলাফল দেখতে পায় না ... তবে প্রয়োজনের পরে এটি সক্রিয় করা সহজ।
উপসংহার
আপনি যখন রিটার্ন কোডগুলি ব্যবহার করে কোড করেন, আপনি ব্যর্থতার জন্য নিজেকে প্রস্তুত করেন এবং আশা করেন আপনার পরীক্ষার দুর্গ যথেষ্ট নিরাপদ is
আপনি যখন ব্যতিক্রম ব্যবহার করে কোড করেন, আপনি জানেন যে আপনার কোডটি ব্যর্থ হতে পারে, এবং সাধারণত আপনার কোডের নির্বাচিত কৌশলগত অবস্থানে কাউন্টারফায়ার ক্যাচ রাখে। তবে সাধারণত, আপনার কোডটি "এটি কী করতে হবে" তারপরে "আমার ভয় যা ঘটবে" সম্পর্কে আরও বেশি।
তবে আপনি যখন কোনও কোড করবেন, আপনার অবশ্যই আপনার নিষ্পত্তি করার সর্বোত্তম সরঞ্জামটি ব্যবহার করতে হবে এবং কখনও কখনও এটি "কোনও ত্রুটি কখনই আড়াল করবেন না এবং যত তাড়াতাড়ি সম্ভব এটি প্রদর্শন করুন"। আমি উপরে যে ম্যাক্রোর কথা বলেছি তা এই দর্শন অনুসরণ করে।