.NET- এ অবৈধ বা অপ্রত্যাশিত পরামিতিগুলির জন্য কোন ব্যতিক্রম নিক্ষেপ করা উচিত?


163

.NET- এ অবৈধ বা অপ্রত্যাশিত পরামিতিগুলির জন্য কি ধরণের ব্যতিক্রম নিক্ষেপ করা উচিত? আমি কখন অন্যের পরিবর্তে একজনকে বেছে নেব?

ফলো-আপ:

আপনি যদি কোনও মাসের সাথে সম্পর্কিত কোনও পূর্ণসংখ্যার প্রত্যাশা করে কোনও ফাংশন ব্যবহার করেন এবং আপনি '42' তে উত্তীর্ণ হন তবে আপনি কোন ব্যতিক্রমটি ব্যবহার করবেন? এটি সংগ্রহ না হলেও এই "আউট অফ রেঞ্জ" বিভাগে পড়বে?

উত্তর:


249

আমি ব্যবহার করতে চান: ArgumentException, ArgumentNullException, এবং ArgumentOutOfRangeException

  • ArgumentException - যুক্তি দিয়ে কিছু ভুল।
  • ArgumentNullException - যুক্তি শূন্য।
  • ArgumentOutOfRangeException - আমি এটিকে খুব বেশি ব্যবহার করি না, তবে একটি সাধারণ ব্যবহার হ'ল একটি সংগ্রহের সাথে সূচীকরণ, এবং একটি সূচক যা বড়।

এছাড়াও অন্যান্য অপশন রয়েছে যেগুলি তর্কটিতে এতটা মনোযোগ দেয় না, বরং পুরো কলটি বিচার করে:

  • InvalidOperationException- যুক্তিটি ঠিক থাকতে পারে তবে বস্তুর বর্তমান অবস্থায় নয় not ক্রেডিট এসটিডাব্লুতে (আগে ইয়ুডার) to তার উত্তরটিও ভোট দিন ।
  • NotSupportedException- পাস হওয়া আর্গুমেন্টগুলি বৈধ, তবে কেবল এই বাস্তবায়নে সমর্থিত নয়। কোনও এফটিপি ক্লায়েন্টের কল্পনা করুন এবং ক্লায়েন্ট সমর্থন না করে এমন একটি আদেশ আপনি পাস করেছেন।

কৌশলটি ব্যতিক্রমটিকে ছুঁড়ে ফেলা হয় যা সর্বোত্তমভাবে প্রকাশ করে যে পদ্ধতিটিকে কেন সেভাবে বলা যায় না। আদর্শভাবে, ব্যতিক্রমটি কী ভুল হয়েছে, কেন এটি ভুল হয়েছে এবং কীভাবে এটি ঠিক করতে হবে সে সম্পর্কে বিস্তারিত হওয়া উচিত।

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

মন্তব্যের জন্য আবার STW (প্রাক্তন ইয়ুডার) কে ধন্যবাদ।


আপনার অনুসরণের প্রতিক্রিয়া হিসাবে, আমি একটি নিক্ষেপ করা হবে ArgumentOutOfRangeException। এই ব্যতিক্রম সম্পর্কে এমএসডিএন কী বলে তা দেখুন:

ArgumentOutOfRangeExceptionযখন কোনও পদ্ধতি চালিত হয় তখন নিক্ষেপ করা হয় এবং পদ্ধতিটিতে পাস হওয়া কমপক্ষে একটি আর্গুমেন্ট নাল রেফারেন্স নয় ( Nothingভিজ্যুয়াল বেসিক) এবং এতে কোনও বৈধ মান থাকে না।

সুতরাং, এক্ষেত্রে আপনি একটি মান পাস করছেন, তবে এটি আপনার বৈধ মান নয়, যেহেতু আপনার পরিসীমা 1-12 হয়। তবে আপনি যেভাবে এটি নথিভুক্ত করছেন তা এটি পরিষ্কার করে দেয়, আপনার এপিআই কী ছুঁড়ে what কারণ যদিও আমি বলতে পারি ArgumentOutOfRangeException, অন্য বিকাশকারী বলতে পারে ArgumentException। এটি সহজ করুন এবং আচরণটি নথি করুন।


চুপ! আমি সম্মত হয়েছি যে আপনি তাঁর নির্দিষ্ট প্রশ্নের ঠিক ঠিক উত্তর দিয়েছেন, তবে প্রতিরক্ষা কোডিং এবং বৈধতা পরামিতিগুলি খুঁজে পাওয়ার জন্য নীচে আমার উত্তরটি দেখুন ;
এসটিডাব্লু

+1 তবে কী ব্যতিক্রম নিক্ষেপ করা হয়েছে তা ডকুমেন্ট করা এবং কেন 'ডান'টিকে বাছাই করা তার চেয়ে বেশি গুরুত্বপূর্ণ।
পাইপজাইক

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

4
দ্রষ্টব্য, আপনি যদি আর্গুমেন্টএক্সসেপশন ধরেন তবে এটি আরগমেন্টআউটঅফফ্রেঞ্জকেও ধরবে।
স্টিভেন এভার্স

কীভাবে FormatException: আর্গুমেন্টের ফর্ম্যাটটি অবৈধ বা সংমিশ্রিত বিন্যাসের স্ট্রিংটি ভালভাবে তৈরি না হওয়ার সময় নিক্ষিপ্ত ব্যতিক্রম।
অ্যান্টনি

44

আমি জোশের উত্তরের পক্ষে ভোট দিয়েছি , তবে তালিকায় আরও একটি যুক্ত করতে চাই:

সিস্টেম.অনুদ্দীপক অপসারণটি আর্গুমেন্টটি বৈধ হলে ছোঁড়া উচিত, তবে বস্তুটি এমন অবস্থায় রয়েছে যেখানে আর্গুমেন্টটি ব্যবহার করা উচিত নয়।

এমএসডিএন থেকে নেওয়া আপডেট :

যখন অবৈধ যুক্তি ব্যতীত অন্য কোনও কারণে কোনও পদ্ধতিতে ডাকতে ব্যর্থতা ঘটে তখন সেই ক্ষেত্রে অবৈধ অপশন এক্সসেপশন ব্যবহৃত হয়।

ধরা যাক যে আপনার অবজেক্টের একটি পারফরম্যাকশন (এনএমসোমেকশন অ্যাকশন) পদ্ধতি রয়েছে, বৈধ এনএমসোমঅ্যাকশনগুলি ওপেন এবং ক্লোজ। আপনি যদি পর পর দুটি বার পারফর্মএ্যাকশন (এনএমসোমেকশন.অপেন) কল করেন তবে দ্বিতীয় কলটিতে অযৌক্তিকরীক্ষাটি নিক্ষেপ করা উচিত (যেহেতু যুক্তিটি বৈধ ছিল, তবে নিয়ন্ত্রণের বর্তমান অবস্থার জন্য নয়)

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

public void SomeMethod()
{
    If (m_Disposed) {
          throw new ObjectDisposedException("Object has been disposed")
     }
    // ... Normal execution code
}

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

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


1
ভাল যুক্তি. এটি অবৈধ এবং অনির্দিষ্ট ইনপুটগুলির মধ্যে পার্থক্যটি ব্যাখ্যা করতে পারে। +1
ড্যানিয়েল ব্রুকনার

হ্যাঁ, আমি আপনার সাথে একমত হয়েছি কেবল আপনার বজ্র চুরি করতে যাচ্ছিল না। তবে যেহেতু আপনি এটি নির্দেশ করেছেন, আমি আমার উত্তর আপডেট করেছি
জোশবার্ক

38

আসল মান এবং কোন ব্যতিক্রমটি সেরা ফিট করে তার উপর নির্ভর করে:

যদি এটি যথেষ্ট সুনির্দিষ্ট না হয় তবে কেবলমাত্র আপনার নিজস্ব ব্যতিক্রম শ্রেণি থেকে উদ্ভূত করুন ArgumentException

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


6
এমএসডিএন এর পৃষ্ঠা থেকে অবৈধ অপশন এক্সপসেশন থেকে নেওয়া: "যখন অবৈধ যুক্তি ব্যতীত অন্য কোনও কারণে কোনও পদ্ধতিতে অনুরোধ করতে ব্যর্থ হয় তখন অবৈধ অপপ্রেশনএক্সসেপশন ব্যবহার করা হয়।"
এসটিডাব্লু


3

ArgumentException :

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

নির্দিষ্ট ধরণের অবৈধতার জন্য কয়েকটি উপশ্রেণীও উপস্থিত রয়েছে। লিঙ্কটিতে সাব টাইপের সংক্ষিপ্তসার রয়েছে এবং কখন সেগুলি প্রয়োগ করা উচিত।


1

সংক্ষিপ্ত উত্তর:
না

দীর্ঘ উত্তর:
আর্গুমেন্ট * ব্যাতিক্রম ব্যবহার (কোনও লাইব্রেরি ছাড়া এটিতে পণ্য যেমন যেমন উপাদানগুলির পাঠাগার) কেবল গন্ধ। ব্যতিক্রমগুলি ব্যতিক্রম নয় এবং ব্যবহারকারীর (যেমন এপিআই কনজিউমার) ঘাটতি নয়, ব্যতিক্রমী পরিস্থিতি পরিচালনা করা to

দীর্ঘতম উত্তর:
অবৈধ আর্গুমেন্টের জন্য ব্যতিক্রম ছোঁড়া অভদ্র, যদি আপনি কোনও লাইব্রেরি না লিখে থাকেন।
আমি দুটি (বা আরও) কারণে, দৃser়তাগুলি ব্যবহার করতে পছন্দ করি:

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

নাল ব্যতিক্রমগুলি হ্যান্ডলিংয়ের মতো দেখাচ্ছে (ব্যঙ্গাত্মক হওয়া স্পষ্টতই):

try {
    library.Method(null);
}
catch (ArgumentNullException e) {
    // retry with real argument this time
    library.Method(realArgument);
}

পরিস্থিতি প্রত্যাশিত তবে ব্যতিক্রমী (ব্যতিক্রমী ব্যবহারকারীর নিয়ন্ত্রণের বাইরে যেমন আইও ব্যর্থতা হয়) ব্যবহার করা হবে। আর্গুমেন্ট * ব্যতিক্রম একটি বাগের ইঙ্গিত এবং এটি (আমার মতামত) পরীক্ষা দিয়ে পরিচালিত হবে এবং ডিবাগের সাথে সহায়তা করা হবে sআসার্ট

বিটিডাব্লু: এই বিশেষ ক্ষেত্রে আপনি ইনট এর পরিবর্তে মাসের ধরণটি ব্যবহার করতে পারতেন। সুরক্ষা টাইপ করার ক্ষেত্রে সি # সংক্ষিপ্ত হয়ে পড়ে (দিক # নিয়ম!) তবে কখনও কখনও আপনি সমস্ত বাগগুলি একসাথে আটকে রাখতে (বা সংকলনের সময় ধরতে পারেন) catch

এবং হ্যাঁ, মাইক্রোসফ্ট সে সম্পর্কে ভুল।


6
আইএমএইচও, ব্যতিক্রমগুলিও ছুঁড়ে ফেলা উচিত যখন ডাকা পদ্ধতিটি যুক্তিসঙ্গতভাবে এগিয়ে যেতে না পারে। কলারটি বোগাস তর্কগুলি পাস করার পরে এটিতে কেস অন্তর্ভুক্ত রয়েছে। পরিবর্তে আপনি কি করবেন? রিটার্ন -১?
জন স্যান্ডার্স

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

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

0

এখানে একটি স্ট্যান্ডার্ড আর্গুমেন্টএক্সসেপশন রয়েছে যা আপনি ব্যবহার করতে পারেন বা আপনি সাবক্লাস করে নিজের তৈরি করতে পারেন। কয়েকটি নির্দিষ্ট আর্গুমেন্ট এক্সসেপশন ক্লাস রয়েছে:

http://msdn.microsoft.com/en-us/library/system.argumentexception(VS.71).aspx

যার মধ্যে যে কেউ সবচেয়ে ভাল কাজ করে।


1
আমি প্রায় সব ক্ষেত্রেই একমত নই; প্রদত্ত। নেট আর্গুমেন্ট * ব্যতিক্রম ক্লাসগুলি খুব সাধারণভাবে ব্যবহৃত হয় এবং আপনাকে সমস্যার গ্রাহককে অবহিত করতে পর্যাপ্ত নির্দিষ্ট তথ্য সরবরাহ করার ক্ষমতা সরবরাহ করে।
এসটিডব্লিউ

স্পষ্ট করতে - আমি আর্গুমেন্ট * ব্যতিক্রম শ্রেণি থেকে প্রাপ্ত প্রায় সব ক্ষেত্রেই একমত নই। .NET আর্গুমেন্ট ব্যতিক্রমগুলির সাথে একটি বর্ণনামূলক এবং স্পষ্ট বার্তা ব্যবহার করে যেখানে আর্গুমেন্টগুলি অবৈধ সেখানে কম-বেশি প্রতিটি পরিস্থিতিতে যথেষ্ট বিশদ সরবরাহ করে।
এসটিডাব্লু

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