বিমূর্ত ব্যতিক্রম সুপার টাইপ


17

যদি ফেলে দেওয়া System.Exceptionএত খারাপ বিবেচিত হয় তবে প্রথমে কেন Exceptionতৈরি করা হয়নি abstract?

এইভাবে, কল করা সম্ভব হবে না:

throw new Exception("Error occurred.");

এটি ঘটেছে ত্রুটি সম্পর্কে আরও বিশদ সরবরাহ করতে প্রাপ্ত ব্যতিক্রমগুলি ব্যবহার করে প্রয়োগ করবে।

উদাহরণস্বরূপ, যখন আমি কোনও গ্রন্থাগারের জন্য একটি কাস্টম ব্যতিক্রম শ্রেণিবিন্যাস সরবরাহ করতে চাই, আমি সাধারণত আমার ব্যতিক্রমগুলির জন্য একটি বিমূর্ত বেস শ্রেণি ঘোষণা করি:

public abstract class CustomExceptionBase : Exception
{
    /* some stuff here */
}

এবং তারপরে আরও কিছু সুনির্দিষ্ট উদ্দেশ্যে ব্যতিক্রম প্রাপ্ত:

public class DerivedCustomException : CustomExceptionBase
{
    /* some more specific stuff here */
}

তারপরে যেকোন লাইব্রেরি পদ্ধতিতে কল করার সময় লাইব্রেরি থেকে আসা কোনও ত্রুটি সরাসরি ধরার জন্য এই জেনেরিক চেষ্টা / ক্যাচ ব্লক থাকতে পারে:

try
{
    /* library calls here */
}
catch (CustomExceptionBase ex)
{
    /* exception handling */
}

এটি কি একটি ভাল অনুশীলন?

Exceptionবিমূর্ত তৈরি করা ভাল কি ?

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


3
+1 "ভুল ব্যবহার রোধ করার সর্বোত্তম উপায় হ'ল এইরকম ব্যবহার অসম্ভব করে দেওয়া" " - স্কট মায়ার্স
স্টিভেন জিউরিস

3
"ব্যতিক্রমটিকে বিমূর্ত করে তোলা ভাল কি হবে?" - নিখুঁতভাবে নয়, কারণ সমস্ত বিদ্যমান .NET কোড যা নতুন এক্সেপশন ("...") ব্যবহার করে তা ভেঙে যায়। যাইহোক, ".NET টিম কি ব্যতিক্রম শুরু করার সাথে সাথে ব্যতিক্রমীকরণ করা উচিত ছিল?" - সম্ভবত, হ্যাঁ, তবে এটি এখন 10 বছর বেশি দেরী করেছে :)
ম্যাটড্যাভি

উত্তর:


11

আমি কেন জানি না যে এটি কেন এইভাবে করা হয়েছিল এবং একটি সারট্রিন ডিগ্রিতে আমি স্বীকার করি যে সীমিত বিস্তৃত ব্যতিক্রমগুলি ছুঁড়ে ফেলা থেকে বিরত রাখা ভাল জিনিস।

কিন্তু ... ছোট ডেমো অ্যাপস বা প্রুফ-অফ-কনসেপ্টগুলি কোডিং করার সময়, আমি 10 টি ভিন্ন ব্যতিক্রম উপ-শ্রেণীর নকশা শুরু করতে চাই না, বা পরিস্থিতিটির জন্য "সেরা" ব্যতিক্রম শ্রেণি কোনটি সিদ্ধান্ত নেওয়ার চেষ্টা করতে ব্যয় করছি। আমি বরং কেবল Exceptionএকটি স্ট্রিং নিক্ষেপ করব এবং বিশদটি ব্যাখ্যা করে pass এটা নিক্ষেপ-দূরে কোড, এসব যত্ন সম্পর্কে না কখন এবং যদি আমি ছিল বাধ্য ধরনের জিনিস যত্নশীল, আমি পারেন আমার নিজের তৈরি চাই GenericExceptionশ্রেণী এবং নিক্ষেপ করে সর্বত্র, অথবা একটি ভিন্ন টুল / ভাষা থেকে পদক্ষেপ। কিছু প্রকল্পের জন্য, আমি সম্মত হই যে প্রাসঙ্গিকভাবে ব্যতিক্রমী সাবক্লাসগুলি যথাযথভাবে তৈরি করা গুরুত্বপূর্ণ, তবে সমস্ত প্রকল্পের প্রয়োজন হয় না।


আমি আপনার সাথে পুরোপুরি একমত, কিন্তু প্রশ্নটি স্পষ্টভাবে অ-তুচ্ছ প্রকল্পগুলি সম্পর্কে ভাবছিল।
মার্কো ফিসেট

3

সম্ভাব্যতা এ: এটি যৌক্তিকভাবে সঠিক।

আপনারা ঠিক বলেছেন যে মাইক্রোসফ্ট সহ আরও অনেকেই নিক্ষেপ করার পরামর্শ দেয় না new Exception() কারণের জন্য সরাসরি সরাসরি ।

বলা হচ্ছে, আমরা একাডেমিক আদর্শ বিবেচনা করতে পারি যে Exceptionশ্রেণীর শ্রেণিবিন্যাসের উদ্দেশ্য একটি সংকীর্ণ প্রভাবকে সংজ্ঞায়িত করা যাতে কেবলমাত্র সর্বাধিক নির্দিষ্ট ব্যতিক্রমগুলি ধরা যায়। (অর্থাত্ ArgumentNullExceptionসংকীর্ণের চেয়ে স্বল্প ArgumentException)।

ব্যতিক্রম শ্রেণিটি ব্যতিক্রম নয় (পাং উদ্দেশ্যে নয়)। এটি বিস্তৃত সম্ভাব্য ব্যতিক্রম, একটি "সুপার ব্যতিক্রম" হিসাবে লক্ষ্য করা যায় যা প্রায় ধরা যায় না কারণ এর ব্যাপ্তি অসীম প্রশস্ত। 'ব্যতিক্রম' abstractএই অর্থে নয় যে ব্যতিক্রমটি তার নিজের কোনও সত্তা হিসাবে থাকতে পারে না। এটি (যদিও স্বীকৃত কোনও ভাল কেস এখনও সংজ্ঞায়িত করা যায় না - সম্ভাব্য বি দেখুন), এবং তাই প্রকাশ্যে গঠনমূলক হতে হবে।

'অ্যাবস্ট্রাক্ট' কীওয়ার্ডটি (খাঁটি একাডেমিক অর্থে) কেবল তখনই প্রযোজ্য যখন বেস শ্রেণিটি তার নিজের উপর কোনও অর্থ রাখে না - অর্থাৎ FourLeggedAnimal

মনের মধ্যে এই সব, কোন হবে প্রযুক্তিগত বর্গ করতে কারণ abstract, বিকাশকারীদের কাছে প্রকোপ বৃদ্ধি একটি উৎস হতে ছাড়া অন্য

সম্ভাব্যতা বি: ডিজাইন লক-ইন / তারা জানত না

এমএস যদি এই শ্রেণিটিকে বিমূর্ত করে তোলে তবে তারা যদি রাস্তায় মন পরিবর্তন করে তবে তারা সমস্যায় পড়ে থাকতে পারে, কারণ এই শ্রেণিটি ভাষার মৌলিক বিষয়গুলির জন্য অত্যন্ত প্রয়োজনীয়। তারা ইতিমধ্যে এর সাথে বোকা বানিয়েছে ApplicationException, তাই তারা অদূরদর্শী যে তারাও রাস্তায় সুপারিশের পরিবর্তনের প্রত্যাশা করেছিল। (দেখুন http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/644822.aspx )

অন্যান্য কারণও থাকতে পারে (আমি ভাবছি এটির প্রতিচ্ছবি, বা অন্য কোনও প্রযুক্তিগত কারণের সাথে সম্পর্কিত থাকতে পারে), তাই আমি এই পোস্টটিকে সিডব্লিউ করছি।


"এটি কেবল" সুপার-ওয়াইড "হওয়ায় এটি বিমূর্ত নয়" " ... তবে ওপি'র যুক্তি এটা নয়। এটি কি এই অর্থে বিমূর্ত হওয়া উচিত নয় যে ব্যতিক্রমের ধরণের কিছু ইঙ্গিতটি সর্বদা পাস করা প্রয়োজন।
স্টিভেন জিউরিস

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

@ কেভিনম্যাককর্মিক: এখানে 'বিমূর্ত' শব্দটি ভাষার কীওয়ার্ড হিসাবে ব্যবহৃত হয়। দয়া করে বলুন কীভাবে আমি আমার প্রশ্নটি পরিবর্তন করতে পারি যাতে এটি ভবিষ্যতের পাঠকদের জন্য পরিষ্কার হয়?
মার্কো ফিসেট

আমি মনে করি এটি একটি দুর্দান্ত প্রশ্ন। abstractকীওয়ার্ড সম্পর্কিত যে কোনও ওও রূপান্তর এই প্রাচীরটিকে হিট করে। abstractব্যাকটিক্স সহ কীওয়ার্ডটি বোঝানো ছাড়া অন্য কোনও উপায়ে যাওয়ার বিষয়ে নিশ্চিত নন ।
কেভিন ম্যাককর্মিক

2
কীভাবে "নিষ্ক্রিয় করা" একটি শ্রেণি একটি ব্রেকিং পরিবর্তন?
Configurator
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.