আমার গ্রন্থাগারের জন্য প্রয়োগ করতে ব্যতিক্রম একটি 'ভাল নম্বর' কি?


20

আমি সর্বদা ভাবছিলাম যে আমার সফ্টওয়্যারটির বিভিন্ন টুকরা জন্য আমার কতগুলি ব্যতিক্রম ব্যতিক্রমী ক্লাস প্রয়োগ করা উচিত এবং তা নিক্ষেপ করা উচিত। আমার বিশেষ বিকাশ সাধারণত সি ++ / সি # / জাভা সম্পর্কিত, তবে আমি বিশ্বাস করি এটি সমস্ত ভাষার জন্য একটি প্রশ্ন।

আমি বুঝতে চাই যে নিক্ষেপ করার জন্য বিভিন্ন ব্যতিক্রমের ভাল সংখ্যা কী এবং বিকাশকারী সম্প্রদায় কীভাবে একটি ভাল গ্রন্থাগারের প্রত্যাশা করে।

আমি যে ট্রেড-অফ দেখি সেগুলির মধ্যে রয়েছে:

  • আরও ব্যতিক্রম ক্লাসগুলি এপিআই ব্যবহারকারীদের জন্য ত্রুটি পরিচালনা করার জন্য খুব সূক্ষ্ম শস্যের স্তরকে অনুমোদন করতে পারে (ব্যবহারকারী কনফিগারেশন বা ডেটা ত্রুটিযুক্ত বা ফাইলগুলি খুঁজে পাওয়া যায়নি)
  • আরও ব্যতিক্রম শ্রেণি ত্রুটি নির্দিষ্ট তথ্যকে কেবল একটি স্ট্রিং বার্তা বা ত্রুটি কোডের পরিবর্তে ব্যতিক্রমটিতে এম্বেড করার অনুমতি দেয়
  • আরও ব্যতিক্রম ক্লাস মানে আরও কোড রক্ষণাবেক্ষণ করতে পারে
  • আরও ব্যতিক্রম ক্লাসের অর্থ এপিআই ব্যবহারকারীদের কাছে কম পৌঁছনীয় can

আমি যেসব পরিস্থিতিতে ব্যতিক্রম ব্যবহার বুঝতে চাই তার মধ্যে রয়েছে:

  • 'কনফিগারেশন' পর্যায়ে, এতে ফাইলগুলি লোড করা বা পরামিতিগুলি সেট করা থাকতে পারে
  • একটি 'অপারেশন' টাইপ পর্বের সময় যেখানে গ্রন্থাগারটি সম্ভবত কোনও থ্রেডে কাজ চালাচ্ছে এবং কিছু কাজ করছে

ব্যতিক্রম ব্যবহার না করে ত্রুটি প্রতিবেদন করার অন্যান্য প্যাটার্নগুলিতে বা কম ব্যতিক্রম (তুলনা হিসাবে) এর মধ্যে অন্তর্ভুক্ত থাকতে পারে:

  • কম ব্যতিক্রম, তবে ত্রুটি কোড এম্বেড করা যা লুকিং হিসাবে ব্যবহার করা যেতে পারে
  • ফাংশন থেকে সরাসরি ত্রুটি কোডগুলি এবং পতাকাগুলি ফিরিয়ে দেওয়া (কখনও কখনও থ্রেড থেকে সম্ভব হয় না)
  • ত্রুটি হওয়ার পরে একটি ইভেন্ট বা কলব্যাক সিস্টেম প্রয়োগ করেছে (স্ট্যান্ড আনওয়াইন্ডিং এড়ানো)

বিকাশকারী হিসাবে আপনি কী দেখতে পছন্দ করেন?

যদি অনেক ব্যতিক্রম হয়, আপনি কি অন্যভাবে আলাদাভাবে পরিচালনা করতে ত্রুটি বিরক্ত করেন?

ক্রিয়াকলাপের পর্যায়ে নির্ভর করে ত্রুটি পরিচালনা করার ধরণের জন্য আপনার কী পছন্দ আছে?



5
"ব্যবহারকারীগণের কাছে এপিআই কম পৌঁছনীয়" - একাধিক ব্যতিক্রম শ্রেণি যা এপিআইয়ের জন্য একটি সাধারণ বেস শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত তা নিয়ে কাজ করা যেতে পারে। তারপরে আপনি যেমন শুরু করছেন ঠিক তেমন সমস্ত বিবরণ নিয়ে চিন্তা না করেই ব্যতিক্রমটি কোন এপিআই থেকে এসেছে তা আপনি দেখতে পাবেন। আপনি যখন এপিআই ব্যবহার করে আপনার প্রথম প্রোগ্রামটি শেষ করছেন, ততক্ষণে যদি আপনাকে ত্রুটি সম্পর্কে আরও তথ্যের প্রয়োজন হয় তবে আপনি ব্যতিক্রমগুলি আসলে কী বোঝায় তা দেখতে শুরু করে। অবশ্যই আপনি একই সাথে আপনার যে ভাষাটি ব্যবহার করছেন তার স্ট্যান্ডার্ড ব্যতিক্রম শ্রেণিবিন্যাসের সাথে দুর্দান্ত খেলতে হবে।
স্টিভ জেসোপ

প্রাসঙ্গিক পয়েন্ট স্টিভ
ফুজ

উত্তর:


18

আমি এটা সহজ রাখি।

একটি লাইব্রেরিতে একটি বেস ব্যতিক্রম প্রকার রয়েছে যা স্ট্যান্ড ::: রানটাইম_অরর থেকে প্রসারিত (এটি সি ++ থেকে অন্যান্য ভাষার ক্ষেত্রে উপযুক্ত হিসাবে প্রযোজ্য)। এই ব্যতিক্রমটি একটি বার্তার স্ট্রিং নেয় যাতে আমরা লগ করতে পারি; প্রতিটি থ্রো পয়েন্টের একটি অনন্য বার্তা থাকে (সাধারণত একটি স্বতন্ত্র আইডি সহ)।

এটা সম্বন্ধে.

নোট 1 : এমন পরিস্থিতিতে যেখানে কেউ ব্যতিক্রম ধরা ব্যতিক্রমগুলি ঠিক করতে পারে এবং ক্রিয়াটি আবার শুরু করতে পারে। আমি দূরবর্তী স্থানে সম্ভাব্য স্বতন্ত্রভাবে স্থির করা যেতে পারে এমন জিনিসগুলির জন্য উদ্ভূত ব্যতিক্রমগুলি যুক্ত করব। তবে এটি খুব বিরল (মনে রাখবেন ক্যাচারটি থ্রোক পয়েন্টের কাছাকাছি থাকার সম্ভাবনা নেই সুতরাং সমস্যার সমাধান করা কঠিন হতে চলেছে (তবে সবকিছু পরিস্থিতির উপর নির্ভরশীল))।

দ্রষ্টব্য 2 : কখনও কখনও পাঠাগারটি এত সহজ হয় যে এটি তার নিজস্ব ব্যতিক্রম দেওয়ার মতো নয় এবং স্ট্যান্ড :: রানটাইম_অরর করবে। স্ট্যান্ড :: রানটাইম_অররারের সাথে আলাদা করার ক্ষমতা ব্যবহারকারীর সাথে এটির কিছু করার জন্য পর্যাপ্ত তথ্য দিতে পারে তবে কেবল ব্যতিক্রম হওয়া জরুরি।

দ্রষ্টব্য 3 : একটি শ্রেণীর মধ্যে আমি সাধারণত ত্রুটি কোডগুলি পছন্দ করি (তবে এগুলি আমার শ্রেণীর সর্বজনীন এপিআই জুড়ে কখনই পালাতে পারে না)।

আপনার বাণিজ্য বন্ধের দিকে তাকিয়ে:

আমি যে ট্রেড-অফ দেখি সেগুলির মধ্যে রয়েছে:

আরও ব্যতিক্রম ক্লাসগুলি এপিআই ব্যবহারকারীদের জন্য ত্রুটি পরিচালনা করার জন্য খুব সূক্ষ্ম শস্যের স্তরকে অনুমোদন করতে পারে (ব্যবহারকারী কনফিগারেশন বা ডেটা ত্রুটিযুক্ত বা ফাইলগুলি খুঁজে পাওয়া যায়নি)

আরও ব্যতিক্রম কি সত্যিই আপনাকে সূক্ষ্ম শস্য নিয়ন্ত্রণ দেয়? প্রশ্নটি পরিণত হয় ব্যতিক্রমের ভিত্তিতে ক্যাচিং কোডটি সত্যই ত্রুটিটি ঠিক করতে পারে। আমি নিশ্চিত যে এরকম পরিস্থিতি রয়েছে এবং এই ক্ষেত্রে আপনার আর একটি ব্যতিক্রম হওয়া উচিত। তবে আপনি কেবলমাত্র কার্যকর সংশোধনের উপরে তালিকাভুক্ত সমস্ত ব্যতিক্রম হ'ল একটি বড় সতর্কতা উত্পন্ন করা এবং অ্যাপ্লিকেশনটি বন্ধ করা।

আরও ব্যতিক্রম শ্রেণি ত্রুটি নির্দিষ্ট তথ্যকে কেবল একটি স্ট্রিং বার্তা বা ত্রুটি কোডের পরিবর্তে ব্যতিক্রমটিতে এম্বেড করার অনুমতি দেয়

ব্যতিক্রম ব্যবহারের জন্য এটি দুর্দান্ত কারণ। তবে তথ্যটি যেটিকে ক্যাশে করছে তার অবশ্যই দরকারী। তারা কিছু সংশোধনমূলক ক্রিয়া সম্পাদন করতে তথ্য ব্যবহার করতে পারেন? যদি অবজেক্টটি আপনার লাইব্রেরির অভ্যন্তরীণ এবং এপিআইয়ের কোনওটিকে প্রভাবিত করতে ব্যবহার না করা যায় তবে তথ্যটি অকেজো। আপনার খুব সুনির্দিষ্ট হওয়া দরকার যে নিক্ষেপ করা তথ্যের যে কোনও ব্যক্তির পক্ষে এটি কার্যকর করতে পারে তার একটি দরকারী মূল্য রয়েছে। এটি যে ব্যক্তি ধরছে সে সাধারণত আপনার পাবলিক এপিআই এর বাইরে থাকে তাই আপনার তথ্যটি টেইলার করে রাখুন যাতে এটি আপনার পাবলিক এপিআইয়ের জিনিসগুলির সাথে ব্যবহার করা যায়।

যদি তারা কেবলমাত্র ব্যতিক্রম লগইন করতে পারে তবে প্রচুর ডেটা না করে কেবল একটি ত্রুটি বার্তা নিক্ষেপ করা ভাল। ক্যাচারটি সাধারণত ডেটা সহ একটি ত্রুটি বার্তা তৈরি করবে। আপনি যদি ত্রুটি বার্তাটি তৈরি করেন তবে এটি সমস্ত ক্যাচারদের সাথে সামঞ্জস্যপূর্ণ হবে, আপনি যদি ক্যাচারটিকে ত্রুটি বার্তা তৈরি করতে দেন তবে আপনি কে ফোন করছেন এবং কী ধরছেন তার উপর নির্ভর করে একই ত্রুটিটি ভিন্নভাবে প্রতিবেদন করতে পারে।

কম ব্যতিক্রম, তবে ত্রুটি কোড এম্বেড করা যা লুকিং হিসাবে ব্যবহার করা যেতে পারে

আপনাকে আবহাওয়া নির্ধারণ করতে হবে ত্রুটি কোডটি অর্থপূর্ণভাবে ব্যবহার করা যেতে পারে। যদি এটি পারে তবে আপনার নিজস্ব ব্যতিক্রম হওয়া উচিত। অন্যথায় আপনার ব্যবহারকারীদের এখন সেখানে ক্যাচের ভিতরে স্যুইচ স্টেটমেন্টগুলি প্রয়োগ করতে হবে (যা স্বয়ংক্রিয়ভাবে স্টাফগুলি হ্যান্ডেল করার ফলে পুরো পয়েন্টটি পরাস্ত হয়)।

যদি তা না পারেন তবে কেন ব্যতিক্রমটিতে ত্রুটি বার্তা ব্যবহার করবেন না (কোড এবং বার্তাটি বিভক্ত করার দরকার নেই যা এটি দেখার জন্য ব্যথা করে)।

ফাংশন থেকে সরাসরি ত্রুটি কোডগুলি এবং পতাকাগুলি ফিরিয়ে দেওয়া (কখনও কখনও থ্রেড থেকে সম্ভব হয় না)

ফিরিয়ে দেওয়া ত্রুটি কোডগুলি অভ্যন্তরীণভাবে দুর্দান্ত। এটি আপনাকে সেখানে বাগগুলি ঠিক করার অনুমতি দেয় এবং তারপরে এবং আপনাকে নিশ্চিত করতে হবে যে আপনি সমস্ত ত্রুটি কোডগুলি ঠিক করেছেন এবং সেগুলির জন্য অ্যাকাউন্ট। তবে আপনার সর্বজনীন এপিআই জুড়ে এগুলি ফাঁস করা একটি খারাপ ধারণা। সমস্যাটি হ'ল প্রোগ্রামাররা প্রায়শই ত্রুটিযুক্ত অবস্থার জন্য পরীক্ষা করতে ভুলে যায় (একটি ব্যতিক্রম ছাড়া একটি চেক না করা ত্রুটি অ্যাপ্লিকেশনটিকে একটি হ্যান্ডেল পরিচালিত ত্রুটি ছাড়তে বাধ্য করবে যা সাধারণত আপনার সমস্ত ডেটা দূষিত করবে)।

ত্রুটি হওয়ার পরে একটি ইভেন্ট বা কলব্যাক সিস্টেম প্রয়োগ করেছে (স্ট্যান্ড আনওয়াইন্ডিং এড়ানো)

এই পদ্ধতিটি প্রায়শই অন্যান্য ত্রুটি পরিচালনার ব্যবস্থার (বিকল্প হিসাবে নয়) সাথে একত্রে ব্যবহৃত হয়। আপনার উইন্ডোজ প্রোগ্রাম সম্পর্কে চিন্তা করুন। কোনও ব্যবহারকারী একটি মেনু আইটেম নির্বাচন করে একটি ক্রিয়া শুরু করে। এটি ইভেন্টের কাতারে একটি ক্রিয়া উত্পন্ন করে। ইভেন্টের সারিটি শেষ পর্যন্ত ক্রিয়াটি পরিচালনা করতে একটি থ্রেড বরাদ্দ করে। থ্রেডটি অ্যাকশনটি পরিচালনা করবে এবং শেষ পর্যন্ত থ্রেড পুলে ফিরে আসবে এবং অন্য কোনও কাজের জন্য অপেক্ষা করবে। এখানে একটি ব্যতিক্রম অবশ্যই থ্রেড থ্রেড দ্বারা বেসে ধরা উচিত। ব্যতিক্রমটি ধরার ফলাফলটি সাধারণত লুপটির জন্য উত্পন্ন ইভেন্টের ফলস্বরূপ ঘটে যা পরিণামে ব্যবহারকারীকে ত্রুটি বার্তা প্রদর্শিত হতে পারে।

তবে আপনি ব্যতিক্রমের মুখে অবিরত না রাখতে পারলে স্ট্যাকটি উন্মুক্ত করা যাচ্ছে (অন্তত থ্রেডের জন্য)।


+1 টি; থো "অন্যথায় আপনার ব্যবহারকারীদের এখন সেখানে ক্যাচের ভিতরে স্যুইচ স্টেটমেন্টগুলি প্রয়োগ করতে হবে (যা স্বয়ংক্রিয়ভাবে স্টাফগুলি হ্যান্ডেল করে দেওয়ার পুরো পয়েন্টটিকে পরাস্ত করে)"। - কল স্ট্যাক আনওয়ানডিং (যদি আপনি এখনও এটি ব্যবহার করতে সক্ষম হন) এবং জোর করে ত্রুটি পরিচালনা করা এখনও দুর্দান্ত সুবিধা benefits আপনি যখন মাঝখানে এটি ধরতে হবে এবং পুনরায় পাঠাতে হবে তবে এটি অবশ্যই কল স্ট্যাকটিকে আনইন্ডিং করার ক্ষমতা থেকে সরিয়ে ফেলবে।
মের্লিন মরগান-গ্রাহাম

9

আমি সাধারণত:

  1. আর্গুমেন্ট বাগের জন্য একটি ব্যতিক্রম শ্রেণি । যেমন "যুক্তি নাল হতে দেওয়া হয় না", "যুক্তিটি ইতিবাচক হওয়া উচিত", ইত্যাদি। জাভা এবং সি # এর জন্য পূর্বনির্ধারিত ক্লাস রয়েছে; সি ++ এ আমি সাধারণত মাত্র একটি ক্লাস তৈরি করি, স্ট্যান্ড :: ব্যতিক্রম থেকে প্রাপ্ত।
  2. পূর্বশর্ত বাগের জন্য একটি ব্যতিক্রম শ্রেণি । এগুলি আরও জটিল পরীক্ষার জন্য, যেমন "সূচকটি আকারের চেয়ে ছোট হওয়া উচিত"।
  3. বাগ বাগের জন্য একটি ব্যতিক্রম শ্রেণি । এইগুলি স্থায়ীত্বের অর্ধেক পদ্ধতিগুলির জন্য রাজ্যটি পরীক্ষা করার জন্য। যেমন নেতিবাচক, শূন্য বা ধনাত্মক উপাদানগুলি গণনা করার জন্য তালিকার উপরে পুনরাবৃত্তি করার সময় শেষে এই তিনটি আকারের সাথে যুক্ত করা উচিত।
  4. লাইব্রেরিতে নিজেই একটি বেস ব্যতিক্রম শ্রেণি । প্রথমে, এই ক্লাসটি ফেলে দিন। যখন প্রয়োজন দেখা দেয় কেবল তখনই সাব-ক্লাস যুক্ত করা শুরু করুন।
  5. আমি ব্যতিক্রমগুলি মোড়ানো না পছন্দ করি, তবে আমি জানি যে এই বিষয়ে মতামতগুলি পৃথক হয় (এবং ব্যবহৃত ভাষার সাথে খুব সংযুক্ত থাকে)। যদি আপনি মোড়ানো করেন তবে আপনার অতিরিক্ত মোড়ানো ব্যতিক্রম ক্লাসগুলির প্রয়োজন

প্রথম 3 টির জন্য ক্লাসগুলি ডিবাগিং এইডগুলি হওয়ায় তারা কোড দ্বারা পরিচালিত হওয়ার উদ্দেশ্যে নয়। পরিবর্তে, তাদের কেবলমাত্র একটি শীর্ষ-স্তরের হ্যান্ডলারের দ্বারা ধরা উচিত যা তথ্যটি প্রদর্শন করে যেমন ব্যবহারকারী এটি বিকাশকারীকে কপি-পেস্ট করতে পারে (বা আরও ভাল: "প্রতিবেদন পাঠান" বোতাম টিপুন)। সুতরাং বিকাশকারীদের জন্য দরকারী যে তথ্য অন্তর্ভুক্ত করুন: ফাইল, ফাংশন, লাইন নম্বর এবং কিছু বার্তা যা পরিষ্কারভাবে সনাক্ত করে কোন চেকটি ব্যর্থ হয়েছে।

প্রতিটি প্রকল্পের জন্য প্রথম 3 কেস একই হিসাবে, সি ++ এ আমি সাধারণত পূর্ববর্তী প্রকল্প থেকে অনুলিপি করি। যেহেতু অনেকে ঠিক একই কাজ করছেন, সি # এবং জাভার ডিজাইনাররা স্ট্যান্ডার্ড লাইব্রেরিতে সেগুলির জন্য স্ট্যান্ডার্ড ক্লাস যুক্ত করেছিলেন। [আপডেট:] অলস প্রোগ্রামারদের জন্য: একটি শ্রেণি যথেষ্ট হতে পারে এবং কিছু ভাগ্যের সাথে আপনার স্ট্যান্ডার্ড লাইব্রেরিতে ইতিমধ্যে উপযুক্ত ব্যতিক্রম শ্রেণি রয়েছে। আমি ফাইলের নাম এবং লিনেনবারের মতো তথ্য যুক্ত করতে পছন্দ করি যা সি ++ এ ডিফল্ট ক্লাসগুলি সরবরাহ করে না। [শেষ আপডেট]

লাইব্রেরির উপর নির্ভর করে, চতুর্থ ক্ষেত্রে কেবল একটি ক্লাস থাকতে পারে, বা ক্লাসগুলির হ্যান্ডফুল হতে পারে। আমি সহজ শুরু করার জন্য চটপট অ্যাপ্রোচ পছন্দ করি, যখন প্রয়োজন দেখা দেয় তখন সাব-ক্লাস যুক্ত করা হয়।

আমার চতুর্থ মামলা সম্পর্কে বিস্তারিত তর্ক করার জন্য, লোকী আস্তারীর উত্তর দেখুন । আমি তার বিস্তারিত উত্তরের সাথে পুরোপুরি একমত।


+1 টি; কোনও কাঠামোর আয়াতগুলিতে আপনাকে কীভাবে ব্যতিক্রম লিখতে হবে সে সম্পর্কে একটি নির্দিষ্ট পার্থক্য রয়েছে an পার্থক্যটি কিছুটা অস্পষ্ট, তবে আপনি এটি উল্লেখ করেন (গ্রন্থাগারের মামলার জন্য লোকিকে পিছিয়ে দেওয়া)।
মের্লিন মরগান-গ্রাহাম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.