প্রথমত, অন্যদের বলেছেন, জিনিষ না যে সি স্পষ্ট কাটা ++ এই প্রোগ্রামটিতে কারণ বেশিরভাগ প্রয়োজনীয়তা ও বাধা কিছুটা সি বৈচিত্রময় ++, অন্যান্য ভাষায় চেয়ে ESP। সি # এবং জাভা, এতে "অনুরূপ" ব্যতিক্রম সংক্রান্ত সমস্যা রয়েছে।
আমি std :: স্টোফ উদাহরণে প্রকাশ করব:
স্ট্যান্ড :: স্টোফে একটি ফাঁকা স্ট্রিং পাস করা (অবৈধ_আরগমেন্টটি ফেলে দেবে) কোনও প্রোগ্রামিং ত্রুটি নয়
মৌলিক চুক্তি , যেমন আমি এটা দেখতে, এই ফাংশন এটা চেষ্টা করে যে একটি ভাসা তা এর যুক্তি রূপান্তর করতে, এবং কোন এটি করতে ব্যর্থ হলে একটি ব্যতিক্রম দ্বারা রিপোর্ট করা হয়। উভয় সম্ভাব্য ব্যতিক্রম থেকে উদ্ভূত হয় logic_errorকিন্তু প্রোগ্রামার-ত্রুটির অর্থে না কিন্তু "ইনপুট না, কখনও, একটি float রূপান্তরিত যাবে না" অর্থে।
এখানে, কেউ বলতে পারে একটি logic_error এটি ব্যবহার করতে ব্যবহৃত হয়, (রানটাইম) ইনপুট দেওয়া থাকলে, এটি রূপান্তর করার চেষ্টা করা সর্বদা ত্রুটি - তবে এটি নির্ধারণ করা এবং আপনাকে (ব্যতিক্রমের মাধ্যমে) জানানো ফাংশনের কাজ।
পার্শ্ব নোট: এই দর্শন, একটি runtime_error পারে কিছু হিসাবে দেখা পারে যা কোনও ফাংশনকে একই ইনপুট দেয়, তাত্ত্বিকভাবে বিভিন্ন রানের জন্য সফল হতে পারে। (যেমন একটি ফাইল অপারেশন, ডিবি অ্যাক্সেস ইত্যাদি)
পরবর্তী পার্শ্ব দ্রষ্টব্য: সি ++ রিজেক্স লাইব্রেরি এখানকার ত্রুটিটি অর্জন করতে বেছে নিয়েছেruntime_error যদিও এখানকার মতোই এটি শ্রেণিবদ্ধ করা যেতে পারে এমন ক্ষেত্রে (অবৈধ রেজেক্স প্যাটার্ন)।
এটি কেবল আইএমএইচও দেখায় যে সি ++ তে গ্রুপিং logic_বা runtime_ত্রুটিটি বেশ ফাসিক এবং সাধারণ ক্ষেত্রে (*) আসলেই খুব একটা সহায়তা করে না - যদি আপনাকে নির্দিষ্ট ত্রুটিগুলি পরিচালনা করতে হয় তবে আপনার সম্ভবত দুটিয়ের চেয়ে কম ধরা দরকার।
(*): যে বলতে চাই যে কোড একটি একক টুকরা সামঞ্জস্যপূর্ণ হওয়া উচিত নয় না, কিন্তু কিনা নিক্ষেপ runtime_বা logic_বা custom_somethings সত্যিই যে গুরুত্বপূর্ণ, আমি মনে করি না।
stofএবং উভয় মন্তব্য করতে bitset:
উভয় ফাংশন যুক্তি হিসাবে স্ট্রিং গ্রহণ করে এবং উভয় ক্ষেত্রে এটি হয়:
- কোন প্রদত্ত স্ট্রিং বৈধ কিনা তা কলকারীর জন্য পরীক্ষা করার জন্য অ-তুচ্ছ নয় (উদাহরণস্বরূপ সবচেয়ে খারাপ ক্ষেত্রে আপনাকে ফাংশনটির যুক্তিটি প্রতিলিপি করতে হবে; বিটসেটের ক্ষেত্রে, খালি স্ট্রিংটি বৈধ কিনা তা অবিলম্বে পরিষ্কার হয় না, তাই কর্টর সিদ্ধান্ত নিতে দিন)
- স্ট্রিংটির "পার্স" করার জন্য এটি ইতিমধ্যে ফাংশনের দায়িত্ব, সুতরাং এটি ইতিমধ্যে স্ট্রিংটিকে বৈধতা দিতে হয়েছে, সুতরাং এটি বোঝা যায় যে এটি স্ট্রিংকে "ব্যবহার" করার জন্য একটি ত্রুটি হিসাবে রিপোর্ট করেছে (এবং উভয় ক্ষেত্রেই এটি ব্যতিক্রম) ।
ব্যতিক্রম নিয়ে ঘন ঘন আসে এমন নিয়ম হ'ল "ব্যতিক্রমী পরিস্থিতিতে কেবল ব্যতিক্রমগুলি ব্যবহার করুন"। তবে কোন পরিস্থিতি ব্যতিক্রমী তা কীভাবে জানার জন্য লাইব্রেরির কার্যকারিতা রয়েছে?
এই বিবৃতিটির রয়েছে, আইএমএইচও, দুটি মূল:
পারফরম্যান্স : যদি কোনও ক্রিয়াকলাপটিকে সমালোচনামূলক পথে ডাকা হয় এবং "ব্যতিক্রমী" কেস ব্যতিক্রমী না হয় , অর্থাত্ একটি উল্লেখযোগ্য পরিমাণে ব্যতিক্রম নিক্ষেপের সাথে জড়িত থাকে, তবে ব্যতিক্রম-অনিচ্ছাকৃত-যন্ত্রপাতিটির জন্য প্রতিবার অর্থ প্রদানের কোনও অর্থ হয় না , এবং খুব ধীর হতে পারে।
ত্রুটি পরিচালনা এর স্থানীয় এলাকা : একটি ফাংশন প্রার্থনা করা হয় এবং ব্যতিক্রম অবিলম্বে ধরা এবং প্রক্রিয়া থাকে, তাহলে সেখানে একটি ব্যতিক্রম নিক্ষেপ মধ্যে আছে সামান্য বিন্দু হিসাবে ত্রুটি পরিচালনা আরো বাগাড়ম্বরপূর্ণ হতে হবে সঙ্গেcatch একটি সঙ্গে তুলনায়if ।
উদাহরণ:
float readOrDefault;
try {
readOrDefault = stof(...);
} catch(std::exception&) {
// discard execption, just use default value
readOrDefault = 3.14f; // 3.14 is the default value if cannot be read
}
এখানে যেখানে মতো কাজগুলির এর TryParseবনাম Parseযখন স্থানীয় কোডের জন্য এক সংস্করণ: খেলার মধ্যে আসা আশা যখন স্থানীয় কোড ধরে নেয় যে এটা আসলে পার্স স্ট্রিং বৈধ বলে, এক সংস্করণ প্রত্যাশিত (অর্থাত অ ব্যতিক্রমী) যে পার্সিং ব্যর্থ হবে।
প্রকৃতপক্ষে, stofকেবল একটি মোড়কের চারপাশে কেবল (হিসাবে সংজ্ঞায়িত) strtof, তাই যদি আপনি ব্যতিক্রম না চান, তবে এটি ব্যবহার করুন।
সুতরাং, আমি কীভাবে সিদ্ধান্ত নেব যে আমার কোনও বিশেষ ফাংশনের জন্য ব্যতিক্রম ব্যবহার করা উচিত বা না?
আইএমএইচও, আপনার দুটি মামলা রয়েছে:
"লাইব্রেরি" ফাংশনের মতো (প্রায়শই বিভিন্ন প্রসঙ্গে ব্যবহার করা হয়): আপনি মূলত সিদ্ধান্ত নিতে পারবেন না। সম্ভবত উভয় সংস্করণ সরবরাহ করুন, সম্ভবত এমন একটি যা ত্রুটির খবর দেয় এবং একটি মোড়ক সরবরাহকারী যা প্রত্যাবর্তিত ত্রুটিটিকে ব্যতিক্রমে রূপান্তরিত করে।
"অ্যাপ্লিকেশন" ফাংশন (অ্যাপ্লিকেশন কোডের একটি ব্লবের জন্য নির্দিষ্ট, কিছু পুনরায় ব্যবহার করা যেতে পারে তবে অ্যাপস ত্রুটি হ্যান্ডলিং স্টাইল ইত্যাদির দ্বারা আবদ্ধ হয়): এখানে এটি প্রায়শই পরিষ্কার পরিচ্ছন্ন হওয়া উচিত। যদি কোড পাথ (গুলি) ফাংশনগুলিকে কল করে যদি একটি বুদ্ধিমান এবং কার্যকর উপায়ে ব্যতিক্রমগুলি পরিচালনা করে তবে কোনও (তবে নীচে দেখুন) ত্রুটিটি রিপোর্ট করতে ব্যতিক্রমগুলি ব্যবহার করুন । যদি অ্যাপ্লিকেশন কোডটি আরও সহজেই ত্রুটি রিটার্ন শৈলীর জন্য পড়তে এবং লিখিত হয় তবে সেটিকে ব্যবহার করুন।
অবশ্যই এর মধ্যে জায়গাগুলি থাকবে - কেবল যা প্রয়োজন তা ব্যবহার করুন এবং YAGNI মনে রাখবেন।
শেষ কথা, আমি মনে করি আমার জিজ্ঞাসিত প্রশ্নাগুলির বিবৃতি ফিরে পাওয়া উচিত,
কোনও ফাংশন ব্যবহারের ক্ষেত্রে কোডিং ত্রুটি চিহ্নিত করতে থ্রো ব্যবহার করবেন না। প্রক্রিয়াটি একটি ডিবাগারে প্রেরণ করতে বা প্রক্রিয়া ক্রাশ করতে দৃ as়তা বা অন্য প্রক্রিয়া ব্যবহার করুন ...
আমি সমস্ত ত্রুটিগুলির জন্য এটিতে সাবস্ক্রাইব করেছিলাম যা স্পষ্ট ইঙ্গিত দেয় যে কোনও কিছু গুরুতরভাবে গণ্ডগোল হয়েছে বা কলিং কোডটি স্পষ্টভাবে জানেন না যে এটি কী করছে।
তবে কখন উপযুক্ত প্রায়শই উচ্চ অ্যাপ্লিকেশন নির্দিষ্ট হয়, সুতরাং উপরের লাইব্রেরি ডোমেন বনাম অ্যাপ্লিকেশন ডোমেনটি দেখুন।
কলিং পূর্বশর্তগুলি কীভাবে বৈধ করা যায় এবং কীভাবে এই প্রশ্নে এটি ফিরে আসে , তবে আমি এর মধ্যে যাব না, ইতিমধ্যে খুব দীর্ঘ উত্তর দিতে হবে :-)