কেন আমরা এই ব্যতিক্রমগুলি ছুঁড়ে ফেলব না?


111

আমি এই এমএসডিএন পৃষ্ঠা জুড়ে এসেছি যাতে বলা হয়েছে:

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

দুর্ভাগ্যক্রমে, এটি কেন বোঝাতে বিরক্ত করে না। আমি কারণগুলি অনুমান করতে পারি তবে আমি আশা করি যে বিষয়টিতে আরও অনুমোদিত কেউ তাদের অন্তর্দৃষ্টি দিতে পারে।

প্রথম দু'টি কিছু স্পষ্ট ধারণা পোষণ করে তবে দ্বিতীয়টি মনে হয় আপনি যেমন নিয়োগ করতে চান (এবং বাস্তবে আমার আছে) like

আরও, এই কি একমাত্র ব্যতিক্রম এড়ানো উচিত? যদি অন্যরা থাকে তবে তারা কী এবং কেন তাদেরও এড়ানো উচিত?


22
থেকে msdn.microsoft.com/en-us/library/ms182338.aspx : আপনি এই ধরনের ব্যতিক্রম বা লাইব্রেরি বা কাঠামোর মধ্যে SystemException যেমন একটি সাধারণ ব্যতিক্রম ধরন, নিক্ষেপ, তাহলে এটি ভোক্তাদের বাধ্য করে সব ব্যতিক্রম ধরা, অজানা ব্যতিক্রম যা কিছু তারা করে সহ কিভাবে পরিচালনা করতে হয় জানি না।
হেনরিক

3
আপনি কেন নালারফেরান এক্সেপশন নিক্ষেপ করবেন?
রিক

5
@ রিক: অনুরূপ NullArgumentExceptionকিছু লোক উভয়কেই বিভ্রান্ত করতে পারে।
মোসলেম বেন ধাও

2
আমার উত্তর অনুসারে @ রিক এক্সটেনশন পদ্ধতিগুলি
মার্ক গ্রাভেল

3
আর একটি যা আপনি নিক্ষেপ করবেন না তা হ'লApplicationException
ম্যাথু ওয়াটসন

উত্তর:


98

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

একই কারণ এছাড়াও প্রযোজ্য SystemException। যদি আপনি উদ্ভূত প্রকারের তালিকার দিকে লক্ষ্য করেন তবে আপনি খুব আলাদা শব্দার্থবিজ্ঞানের সাথে প্রচুর অন্যান্য ব্যতিক্রম দেখতে পাচ্ছেন।

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

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

অবশ্যই, এই নিয়মগুলির কিছু ব্যতিক্রম (হা) রয়েছে। আপনি যদি এমন কিছু নির্মাণ করছেন যা কোনও ব্যতিক্রমের কারণ হতে পারে যা বিদ্যমান বিদ্যমানটির সাথে হুবহু মিলে যায় তবে তা নির্দ্বিধায় ব্যবহার করুন, বিশেষত যদি আপনি কিছু অন্তর্নির্মিত আচরণের সাথে মেলে চেষ্টা করছেন। কেবলমাত্র আপনি খুব নির্দিষ্ট একটি ব্যতিক্রম প্রকার বেছে নিয়েছেন তা নিশ্চিত করুন।

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


3
তৃতীয় অংশটি আমার কাছে কিছুটা বোঝায় না। অবশ্যই, আপনার পরিবর্তে এই ত্রুটিগুলি শুরু হওয়ার কারণটি এড়ানো উচিত, তবে আপনি যখন উদাহরণস্বরূপ কোনও IListপ্রয়োগ লেখেন , অনুরোধকৃত সূচকগুলিকে প্রভাবিত করা আপনার ক্ষমতায় নেই, কোনও সূচক অবৈধ হলে এটি কলারের যুক্তিযুক্ত ভুল, এবং আপনি কেবল তাদের অবহিত করতে পারেন একটি উপযুক্ত ব্যতিক্রম ছুঁড়ে এই যুক্তি ত্রুটি। কেন IndexOutOfRangeExceptionউপযুক্ত নয়?

7
@delnan আপনি বাস্তবায়নে হয় IList, তাহলে আপনি একটি নিক্ষেপ করা হবে ArgumentOutOfRangeExceptionহিসাবে ইন্টারফেস ডকুমেন্টেশন দাড়ায়। IndexOutOfRangeExceptionঅ্যারেগুলির জন্য, এবং যতদূর আমি জানি, আপনি অ্যারেগুলিকে পুনরায় প্রয়োগ করতে পারবেন না।
অকর্মা

2
যা কিছুটা সম্পর্কিত হতে পারে, NullReferenceExceptionসাধারণত অভ্যন্তরীণভাবে এটির একটি বিশেষ ক্ষেত্রে হিসাবে ছুঁড়ে দেওয়া হয় AccessViolationException(আইআইআরসি পরীক্ষাটি হ'ল কিছু হ'ল cmp [addr], addrএটি পয়েন্টারকে অবলম্বন করার চেষ্টা করে এবং যদি এটি অ্যাক্সেস লঙ্ঘনে ব্যর্থ হয় তবে এটি এনআরই এবং এভিইয়ের মধ্যে পার্থক্যকে পরিচালনা করে ফলে বিঘ্নিত হ্যান্ডলারটিতে)। তাই শব্দার্থক কারণে বাদে কিছু প্রতারণামূলক জড়িত রয়েছে। এটি nullসহায়ক না হলে ম্যানুয়ালি পরীক্ষা করা থেকে নিরুৎসাহিত করতেও সহায়তা করতে পারে - আপনি যদি কোনওভাবে এনআরই ছুঁড়তে চলেছেন তবে কেন তা করতে দেবেন না ET
লুয়ান

আপনার শেষ বিবৃতিটি সম্পর্কে, কাস্টম ব্যতিক্রম সম্পর্কে: আমি এটি করার প্রয়োজন বোধ করি নি। সম্ভবত আমি কিছু মিস করছি। কাঠামো থেকে কোনও কিছুর পরিবর্তে কোন শর্তে কাস্টম ব্যতিক্রম প্রকারের কারুকাজ করা দরকার?
ডোনবয়েট নট

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

36

আমি সন্দেহ করি যে শেষ 2 এর অভিপ্রায়টি ইনবিল্ট ব্যতিক্রমগুলির সাথে বিভ্রান্তি রোধ করা যার প্রত্যাশিত অর্থ রয়েছে। যাইহোক, আমি মতামত দিচ্ছি যে আপনি যদি ব্যতিক্রমটির সঠিক অভিপ্রায় সংরক্ষণ করেন : তবে এটি সঠিক throw। উদাহরণস্বরূপ, আপনি যদি কাস্টম সংগ্রহ লিখছেন তবে এটি সম্পূর্ণরূপে যুক্তিসঙ্গত বলে মনে হয় IndexOutOfRangeException- আইএমও, এর থেকে আরও পরিষ্কার এবং আরও নির্দিষ্ট ArgumentOutOfRangeException। এবং List<T>সম্ভবত পরবর্তীটি বেছে নেওয়ার ক্ষেত্রে, ছাত্রলীগে কমপক্ষে ৪১ টি জায়গা (প্রতিচ্ছবিটির সৌজন্যে) রয়েছে (যে বিন্যাসগুলি অন্তর্ভুক্ত নয়) যা স্পোক ছুড়ে ফেলেছে IndexOutOfRangeException- এর মধ্যে কোনওটিই বিশেষ ছাড়ের প্রাপ্য "নিম্ন স্তরের" নয়। হ্যাঁ, আমি মনে করি আপনি ন্যায়সঙ্গতভাবে তর্ক করতে পারেন যে গাইডলাইনটি নির্বোধ। একইভাবে,NullReferenceException এক্সটেনশন পদ্ধতিতে দারুণভাবে কার্যকর - আপনি যদি শব্দার্থক সংরক্ষণ করতে চান তবে:

obj.SomeMethod(); // this is actually an extension method

একটি ছোঁড়ার NullReferenceExceptionযখন objহয় null


2
"আপনি যদি ব্যতিক্রমটির সঠিক উদ্দেশ্যটি সংরক্ষণ করে চলেছেন" - অবশ্যই যদি তাই হয় তবে ব্যতিক্রমটি আপনাকে প্রথমে পরীক্ষা না করে ফেলে দেওয়া হত? এবং যদি আপনি ইতিমধ্যে এটির জন্য পরীক্ষা করে থাকেন তবে এটি কি ব্যতিক্রম নয়?
পগফগলি

5
@ পগফগলি এক্সটেনশন পদ্ধতির উদাহরণটি দেখতে 2 সেকেন্ড সময় নিন: না, এটির জন্য আপনাকে পরীক্ষা না করেই তা ফেলে দেওয়া হবে না। যদি SomeMethod()সদস্য অ্যাক্সেস করার প্রয়োজন না হয় তবে এটিকে বাধ্য করা ভুল is তেমনিভাবে: IndexOutOfRangeExceptionNullReferenceException
বিসিএলে

16
আমি যুক্তি দেব যে একটি এক্সটেনশন পদ্ধতিতে এখনও একটি এর ArgumentNullExceptionপরিবর্তে একটি নিক্ষেপ করা উচিত NullReferenceException। এমনকি যদি এক্সটেনশন পদ্ধতিগুলি থেকে সিনট্যাকটিক চিনি সাধারণ সদস্য অ্যাক্সেসের মতো একই সিনট্যাক্সকে মঞ্জুরি দেয় তবে এটি এখনও খুব আলাদাভাবে কাজ করে। এবং এর থেকে এনআরই নেওয়া MyStaticHelpers.SomeMethod(obj)ঠিক ভুল হবে।
অকর্মা

1
@ পগফুগলি বিসিএল হ'ল "বেস ক্লাস লাইব্রেরি", মূলত মূল নেট। নেট এ।
অকর্মা

1
@ পগফুগলি: এমন অনেক পরিস্থিতি রয়েছে যেখানে প্রাকৃতিকভাবে কোনও শর্ত সনাক্ত করতে ব্যর্থ হওয়ার ফলে একটি "অসুবিধাগ্রস্থ" সময়ে ব্যতিক্রম হতে পারে। যদি কোনও অপারেশন সফল হতে না থাকে, তবে অপারেশনটি শুরু করার চেয়ে আগে ব্যতিক্রম ছুঁড়ে ফেলা ভাল, অর্ধেক পথ পেরিয়ে যাওয়ার পরে এবং ফলস্বরূপ আংশিক-প্রক্রিয়াজাত বিশৃঙ্খলা পরিষ্কার করার চেয়ে ভাল।
সুপারক্যাট

5

আপনি যেমনটি উল্লেখ করেছেন, ব্যতিক্রমগুলি ছড়িয়ে দেওয়ার সময় জিনিসগুলি এড়ানোর বিষয় শীর্ষক ব্যতিক্রমগুলি তৈরি করতে এবং থ্রোয়িং ব্যতিক্রমগুলি (সি # প্রোগ্রামিং গাইড) নিবন্ধে মাইক্রোসফ্ট প্রকৃতপক্ষে System.IndexOutOfRangeExceptionএকটি ব্যতিক্রম হিসাবে তালিকাভুক্ত করেছে যা আপনার নিজস্ব উত্স কোড থেকে ইচ্ছাকৃতভাবে ছুঁড়ে দেওয়া উচিত নয়।

বিপরীতে, তবে, নিবন্ধ নিক্ষেপ (সি # রেফারেন্স) , মাইক্রোসফ্ট তার নিজস্ব নির্দেশিকা লঙ্ঘন করেছে বলে মনে হচ্ছে। মাইক্রোসফ্ট তার উদাহরণের মধ্যে অন্তর্ভুক্ত একটি পদ্ধতি এখানে:

static int GetNumber(int index)
{
    int[] nums = { 300, 600, 900 };
    if (index > nums.Length)
    {
        throw new IndexOutOfRangeException();
    }
    return nums[index];
}

সুতরাং, মাইক্রোসফ্ট নিজেই সুসংগত নয় কারণ এটি IndexOutOfRangeExceptionএর ডকুমেন্টেশনগুলিতে নিক্ষেপ করার বিষয়টি প্রদর্শন করে throw!

এই বিশালাকার আমাকে বিশ্বাস করতে যে ক্ষেত্রে জন্য অন্তত IndexOutOfRangeException, সেখানে অনুষ্ঠান হতে পারে যেখানে যে ব্যতিক্রম টাইপ করতে পারেন প্রোগ্রামারের ফেলে দেওয়া এবং একটি গ্রহণযোগ্য অনুশীলন বিবেচনা করা।


1

যখন আমি আপনার প্রশ্নের পড়া, আমি নিজেকে এক ব্যতিক্রম ধরনের নিক্ষেপ করতে চান কি অবস্থার অধীনে জিজ্ঞাসা NullReferenceException, InvalidCastExceptionবা ArgumentOutOfRangeException

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

পিএস: ২০০৩ সাল থেকে আমি আমার নিজস্ব ব্যাতিক্রমগুলি বিকাশ করছি যাতে আমি তাদের ইচ্ছে মতো ফেলে দিতে পারি। আমি মনে করি এটি করা একটি সেরা অনুশীলন হিসাবে বিবেচিত হয়।


ভাল দিক. তবে আমি মনে করি যে এটি বলা আরও সঠিক হবে যে প্রোগ্রামারটিকে .NET ফ্রেমওয়ার্ক রানটাইমগুলিকে এই ধরণের ব্যতিক্রম ছুঁড়ে দেওয়া উচিত (এবং প্রোগ্রামারটি তাদের উপযুক্ত ফ্যাশনে পরিচালনা করতে হবে)।
ডেভিডআরআর 25'14

0

আলোচনা NullReferenceExceptionএবং IndexOutOfBoundsExceptionএকপাশে রেখে:

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

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

সুতরাং, নিক্ষেপ সংক্রান্ত Exceptionআমি সব ক্ষেত্রে এটি নিষিদ্ধ করার কারণ দেখতে পাচ্ছি না।

সম্পাদনা: এমএসডিএন পৃষ্ঠা থেকেও:

সাধারণ প্রয়োগের অংশ হিসাবে কোনও প্রোগ্রামের প্রবাহ পরিবর্তন করতে ব্যতিক্রমগুলি ব্যবহার করা উচিত নয়। ব্যতিক্রমগুলি কেবল ত্রুটির শর্তগুলি প্রতিবেদন করতে ও পরিচালনা করতে ব্যবহার করা উচিত।

অতিরিক্ত ব্যতিক্রম প্রকারের জন্য পৃথক যুক্তিযুক্ত মাত্রাতিরিক্ত ধরা দখলগুলি সর্বোত্তম অনুশীলন নয়।


ব্যতিক্রম বার্তা এখনও কি আছে তা বলার জন্য রয়েছে। আমি চিত্রটি আনতে পারি না যে আপনি গিয়ে প্রতিটি পৃথক ত্রুটির জন্য একটি নতুন ব্যতিক্রম প্রকার তৈরি করেন, যদি কোনও গ্রাহক প্রোগ্রামিংভাবে এই ত্রুটিগুলি আলাদা করতে চান।
uebe

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