আপনার উভয় ব্যবহার করা উচিত। জিনিসটি প্রতিটি ব্যবহার করার সময় সিদ্ধান্ত নেওয়া হয় ।
একটা হয় কয়েক পরিস্থিতিতে যেখানে ব্যতিক্রম সুস্পষ্ট পছন্দ :
কিছু পরিস্থিতিতে আপনি ত্রুটি কোডটি দিয়ে কিছু করতে পারবেন না , এবং আপনার কেবল কল স্ট্যাকের একটি উচ্চ স্তরে এটি পরিচালনা করতে হবে , সাধারণত কেবল ত্রুটিটি লগ করুন, ব্যবহারকারীর কাছে কিছু প্রদর্শন করুন বা প্রোগ্রামটি বন্ধ করুন। এই ক্ষেত্রে, ত্রুটি কোডগুলির জন্য আপনাকে ত্রুটি কোডগুলি ম্যানুয়ালি স্তরের স্তরে স্তরের করতে হবে যা ব্যতিক্রমগুলির সাথে স্পষ্টতই করা সহজ। মুল বক্তব্যটি এটি অপ্রত্যাশিত এবং অবিচ্ছিন্ন পরিস্থিতিতে জন্য for
তবুও পরিস্থিতি 1 সম্পর্কে (যেখানে অপ্রত্যাশিত এবং অবিচ্ছিন্ন কিছু ঘটে যা আপনি কেবল এটি লগ করতে চান না), ব্যতিক্রমগুলি সহায়ক হতে পারে কারণ আপনি প্রাসঙ্গিক তথ্য যুক্ত করতে পারেন । উদাহরণস্বরূপ, যদি আমি আমার নিম্ন-স্তরের ডেটা সহায়কগুলিতে একটি SQL এ এক্সসেপশন পেয়ে থাকি তবে আমি ত্রুটিটি নিম্ন-স্তরে ধরতে চাই (যেখানে আমি এসকিউএল কমান্ড জানি যা ত্রুটির কারণ হয়েছিল) তাই আমি সেই তথ্যটি ক্যাপচার করতে পারি এবং অতিরিক্ত তথ্যের সাথে পুনর্বিবেচনা করতে পারি । দয়া করে এখানে যাদু শব্দটি নোট করুন: পুনর্বিবেচনা করুন এবং গিলে ফেলবেন না ।
ব্যতিক্রম হ্যান্ডলিংয়ের প্রথম নিয়ম: ব্যতিক্রমগুলি গ্রাস করবেন না । এছাড়াও, নোট করুন যে আমার অভ্যন্তরীণ ক্যাচটিতে কোনও লগ করার দরকার নেই কারণ বাইরের ক্যাচটিতে পুরো স্ট্যাকের চিহ্ন থাকবে এবং এটি লগ হতে পারে।
কিছু পরিস্থিতিতে আপনার কমান্ডগুলির একটি ক্রম থাকে এবং যদি সেগুলির মধ্যে কোনওটি ব্যর্থ হয় তবে আপনার সংস্থানগুলি (*) পরিষ্কার করা / নিষ্পত্তি করা উচিত , এটি একটি অপ্রাপ্তযোগ্য পরিস্থিতি (যা নিক্ষেপ করা উচিত) বা পুনরুদ্ধারযোগ্য পরিস্থিতি (যা ক্ষেত্রে আপনি করতে পারেন) স্থানীয়ভাবে বা কলার কোডে হ্যান্ডেল করুন তবে আপনার ব্যতিক্রমের দরকার নেই)। স্পষ্টতই প্রতিটি পদ্ধতির পরে ত্রুটি কোডগুলি পরীক্ষা করার পরিবর্তে এবং শেষ অবধি ক্লিনআপ / নিষ্পত্তি করার পরিবর্তে এই সমস্ত কমান্ডকে একক চেষ্টা করে রাখা আরও সহজ। দয়া করে নোট করুন যে আপনি যদি ত্রুটিটি বুদ্বুদ করতে চান (যা সম্ভবত আপনি চান) তবে আপনার এটি ধরারও দরকার নেই - আপনি কেবল পরিচ্ছন্নতা / নিষ্পত্তি করার জন্য শেষটি ব্যবহার করেন - আপনি চাইলে কেবল ক্যাচ / রেট্রো ব্যবহার করা উচিত প্রাসঙ্গিক তথ্য যুক্ত করতে (বুলেট ২ দেখুন)।
একটি উদাহরণ হ'ল লেনদেনের ব্লকের ভিতরে এসকিউএল স্টেটমেন্টের ক্রম হবে। আবার এটিও "অবিচ্ছিন্ন" পরিস্থিতি, এমনকি যদি আপনি তাড়াতাড়ি ধরার সিদ্ধান্ত নেন (শীর্ষে বুদবুদ করার পরিবর্তে স্থানীয়ভাবে এটি আচরণ করুন) এটি এখনও মারাত্মক পরিস্থিতি যেখানে সবচেয়ে ভাল ফলাফল হ'ল সবকিছু বাতিল করা বা কমপক্ষে একটি বৃহত্ গর্ভপাত বন্ধ করা where প্রক্রিয়া অংশ।
(*) এটি on error goto
পুরানো ভিজ্যুয়াল বেসিকের মতো
কনস্ট্রাক্টরগুলিতে আপনি কেবল ব্যতিক্রম ছুঁড়ে ফেলতে পারেন।
এটি বলার পরে, অন্যান্য সমস্ত পরিস্থিতিতে যেখানে আপনি কিছু তথ্য ফিরিয়ে দিচ্ছেন যার উপর কলকারীরা কিছু ব্যবস্থা নিতে পারে , রিটার্ন কোডগুলি ব্যবহার করা সম্ভবত একটি ভাল বিকল্প। এটিতে সমস্ত প্রত্যাশিত "ত্রুটি" অন্তর্ভুক্ত রয়েছে , কারণ সম্ভবত এগুলি তাত্ক্ষণিক কলার দ্বারা পরিচালিত হওয়া উচিত এবং স্ট্যাকের মধ্যে খুব বেশি স্তরের স্তূপিত হওয়া খুব কমই দরকার।
অবশ্যই প্রত্যাশিত ত্রুটিগুলি ব্যাতিক্রম হিসাবে গণ্য করা এবং তত্ক্ষণাত্ একপর্যায়ে উপরের এক স্তরকে ধরে ধরা সবসময়ই সম্ভব এবং প্রতিটি সম্ভাব্য ত্রুটির জন্য কোডের প্রতিটি লাইনকে অন্তর্ভুক্ত করা এবং প্রতিটি সম্ভাব্য ত্রুটির জন্য পদক্ষেপ নেওয়াও সম্ভব। আইএমও, এটি খারাপ নকশা, এটি কেবলমাত্র আরও বেশি ভার্বোস নয়, বিশেষত কারণ সম্ভাব্য ব্যতিক্রমগুলি যে উত্সবদ্ধ কোডগুলি পড়ে তা উত্স কোডটি না পড়ে সুস্পষ্ট নয় - এবং ব্যতিক্রমগুলি কোনও গভীর পদ্ধতি থেকে ফেলে দেওয়া যেতে পারে, অদৃশ্য গোটো তৈরি করে । তারা একাধিক অদৃশ্য বহির্গমন পয়েন্ট তৈরি করে কোডের কাঠামো ভঙ্গ করে যা কোডটি পড়া এবং পরীক্ষা করা শক্ত করে তোলে। অন্য কথায়, আপনার প্রবাহ-নিয়ন্ত্রণ হিসাবে কখনও ব্যতিক্রম ব্যবহার করা উচিত নয়, কারণ এটি বুঝতে এবং বজায় রাখা অন্যদের পক্ষে কঠিন। এটি পরীক্ষার জন্য সমস্ত সম্ভাব্য কোড প্রবাহ বুঝতে অসুবিধা পেতে পারে।
আবার: সঠিক পরিষ্কার-পরিচ্ছন্নতার জন্য / নিষ্পত্তি করার জন্য আপনি কিছু না ধরেই শেষ পর্যন্ত চেষ্টা করতে পারেন ।
রিটার্ন কোডগুলি সম্পর্কে সর্বাধিক জনপ্রিয় সমালোচনাটি হ'ল "কেউ ত্রুটি কোডগুলি উপেক্ষা করতে পারে তবে একই অর্থে কেউ ব্যতিক্রমগুলিও গ্রাস করতে পারে। উভয় পদ্ধতিতে খারাপ ব্যতিক্রম হ্যান্ডলিং সহজ But তবে ভাল ত্রুটি-কোড-ভিত্তিক প্রোগ্রাম লেখার জন্য এখনও অনেক সহজ ব্যতিক্রম-ভিত্তিক প্রোগ্রাম লেখার চেয়ে বেশি । এবং যে কোনও কারণে যদি সমস্ত ত্রুটি (পুরানো on error resume next
) উপেক্ষা করার সিদ্ধান্ত নেয় , আপনি সহজেই রিটার্ন কোডগুলি সহ এটি করতে পারেন এবং প্রচুর চেষ্টা-বয়লারপ্লেট ছাড়া আপনি এটি করতে পারবেন না।
রিটার্ন কোডগুলি সম্পর্কে দ্বিতীয় সর্বাধিক জনপ্রিয় সমালোচনাটি হ'ল "বুদবুদ করা কঠিন" - তবে এর কারণ লোকেরা বুঝতে পারে না যে ব্যতিক্রমগুলি পুনরুদ্ধারযোগ্য পরিস্থিতিতে নয়, যখন ত্রুটি-কোডগুলি নয়।
ব্যতিক্রম এবং ত্রুটি কোডগুলির মধ্যে সিদ্ধান্ত নেওয়া ধূসর অঞ্চল। এটি এমনকি সম্ভব যে আপনাকে কিছু পুনরায় ব্যবহারযোগ্য ব্যবসায়ের পদ্ধতি থেকে একটি ত্রুটি কোড পাওয়া দরকার এবং তারপরে আপনি এটিকে একটি ব্যতিক্রম (সম্ভবত তথ্য যুক্ত করে) গুটিয়ে রাখুন এবং এটি বুদবুদ হতে দিন। তবে সমস্ত ত্রুটিগুলি ব্যতিক্রম হিসাবে নিক্ষেপ করা উচিত বলে ধরে নিতে এটি একটি ডিজাইনের ভুল।
এটি যোগ করা:
আমার যখন অপ্রত্যাশিত পরিস্থিতি হয় তখন আমি ব্যতিক্রমগুলি ব্যবহার করতে চাই, যেখানে খুব বেশি কিছু করার নেই এবং সাধারণত আমরা একটি বড় কোড বা এমনকি পুরো অপারেশন বা প্রোগ্রামটি বাতিল করতে চাই ort এটি পুরানো "ত্রুটি গোটো" এর মতো।
কলার কোডটি কিছু ব্যবস্থা নিতে পারে / এমন পরিস্থিতিতে আমি প্রত্যাশা করি যখন আমি রিটার্ন কোডগুলি ব্যবহার করতে চাই। এর মধ্যে বেশিরভাগ ব্যবসায়ের পদ্ধতিগুলি, এপিআই, বৈধতা ইত্যাদি রয়েছে।
ব্যতিক্রম এবং ত্রুটি কোডগুলির মধ্যে এই পার্থক্যটি জিও ভাষার অন্যতম নকশা নীতি, যা মারাত্মক অপ্রত্যাশিত পরিস্থিতিতে "আতঙ্ক" ব্যবহার করে, যখন নিয়মিত প্রত্যাশিত পরিস্থিতি ত্রুটি হিসাবে ফিরে আসে।
তবুও জিও সম্পর্কে, এটি একাধিক রিটার্ন মানকেও মঞ্জুরি দেয় , যা এমন কিছু যা রিটার্ন কোডগুলি ব্যবহারে অনেক সহায়তা করে, যেহেতু আপনি একই সাথে একটি ত্রুটি এবং অন্য কোনও কিছু ফিরিয়ে দিতে পারেন। সি # / জাভাতে আমরা প্যারামিটার, টিপলস বা (আমার প্রিয়) জেনেরিক্সের সাহায্যে এটি অর্জন করতে পারি, যা এনামগুলির সাথে মিলিতভাবে ফোনকারীকে পরিষ্কার ত্রুটি কোড সরবরাহ করতে পারে:
public MethodResult<CreateOrderResultCodeEnum, Order> CreateOrder(CreateOrderOptions options)
{
....
return MethodResult<CreateOrderResultCodeEnum>.CreateError(CreateOrderResultCodeEnum.NO_DELIVERY_AVAILABLE, "There is no delivery service in your area");
...
return MethodResult<CreateOrderResultCodeEnum>.CreateSuccess(CreateOrderResultCodeEnum.SUCCESS, order);
}
var result = CreateOrder(options);
if (result.ResultCode == CreateOrderResultCodeEnum.OUT_OF_STOCK)
// do something
else if (result.ResultCode == CreateOrderResultCodeEnum.SUCCESS)
order = result.Entity; // etc...
যদি আমি আমার পদ্ধতিতে একটি নতুন সম্ভাব্য রিটার্ন যুক্ত করি, তবে সমস্ত কলকারীরা উদাহরণস্বরূপ একটি স্যুইচ স্টেটমেন্টে সেই নতুন মানটি coveringেকে রাখছে কিনা তা আমি চেক করতে পারি। আপনি ব্যতিক্রম ছাড়া সত্যই তা করতে পারবেন না। আপনি যখন রিটার্ন কোডগুলি ব্যবহার করেন, আপনি সাধারণত সমস্ত সম্ভাব্য ত্রুটিগুলি আগাম জানতেন এবং সেগুলির জন্য পরীক্ষা করান। ব্যতিক্রমগুলি সহ আপনি সাধারণত জানেন না কী হতে পারে। ব্যতিক্রম (জেনেরিক্সের পরিবর্তে) এনামগুলিকে আবৃত করা একটি বিকল্প (যতক্ষণ না এটি প্রতিটি পদ্ধতির যে ব্যতিক্রমগুলির ধরণের স্পষ্টতা স্পষ্ট থাকে), তবে আইএমও এটি এখনও খারাপ নকশা।