কখন একটি দৃser়তা ব্যবহার করবেন এবং কখন একটি ব্যতিক্রম ব্যবহার করবেন


121

আমার কোডটিতে একটি শর্ত পরীক্ষা করার জন্য আমি বেশিরভাগ সময় ব্যতিক্রম ব্যবহার করব, আমি অবাক হয়ে বলি যে এটি দৃ use় ব্যবহারের উপযুক্ত সময় কখন?

এই ক্ষেত্রে,

Group group=null;
try{
    group = service().getGroup("abc");
}catch(Exception e){
    //I dont log error because I know whenever error occur mean group not found
}

if(group !=null)
{
    //do something
}

আপনি এখানে কীভাবে একটি দৃser়তা ফিট করতে পারেন তা নির্দেশ করতে পারেন? আমি কি একটি দৃ use়তা ব্যবহার করা উচিত?

দেখে মনে হচ্ছে আমি উত্পাদন কোডে কখনও দৃser়তা ব্যবহার করি না এবং কেবল ইউনিট পরীক্ষায় দৃ as়তা দেখি। আমি জানি যে বেশিরভাগ ক্ষেত্রে আমি উপরের মতো চেকিংয়ের জন্য কেবল ব্যতিক্রম ব্যবহার করতে পারি তবে আমি এটি "পেশাদারভাবে" করার উপযুক্ত উপায় জানতে চাই।

উত্তর:


81

কখনও কখনও ঘটবে না এমন কিছু পরীক্ষা করার জন্য দৃ As়তার সাথে ব্যবহার করা উচিত, যখন ঘটেছিল এমন কিছু পরীক্ষা করার জন্য একটি ব্যতিক্রম ব্যবহার করা উচিত।

উদাহরণস্বরূপ, একটি ফাংশন 0 দ্বারা বিভক্ত হতে পারে, সুতরাং একটি ব্যতিক্রম ব্যবহার করা উচিত, তবে হার্ডড্রাইভ হঠাৎ অদৃশ্য হয়ে গেছে তা খতিয়ে দেখার জন্য একটি দৃser়তা ব্যবহার করা যেতে পারে।

একটি দৃser়তা প্রোগ্রাম চলমান থেকে থামাতে হবে, কিন্তু একটি ব্যতিক্রম প্রোগ্রাম চলমান চলতে দেয়।

মনে রাখবেন যে if(group != null)এটি একটি দাবি নয়, এটি কেবল শর্তযুক্ত।


3
"হার্ডড্রাইভ হঠাৎ করেই নিখোঁজ হয় কিনা তা পরীক্ষা করার জন্য একটি দৃ as় বক্তব্য ব্যবহার করা যেতে পারে" - আমি বলতাম এটি সঠিক নয়: আপনি কেন বিকাশের সময় এই পরিচালনা করতে চান, তবে উত্পাদনে নয় (যখন দৃ typically়তা সাধারণত অক্ষম থাকে)?
Herman

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

1
@ মারিয়াস আপনার শর্তসাপেক্ষে এইরকম একটি প্রতিস্থাপনের সাথে প্রতিস্থাপন করা যেতে পারে:
দৃ group়

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

গ্রেগরি পাকোস পোস্ট করা হলে আরও ভাল উত্তর, দয়া করে সেই পোস্টটি পড়ুন।
ormurin

169

আমার মনের বাইরে (তালিকাটি অসম্পূর্ণ হতে পারে এবং কোনও মন্তব্যে ফিট করার জন্য এটি খুব দীর্ঘ), আমি বলব:

  • সর্বজনীন বা সুরক্ষিত পদ্ধতি এবং কনস্ট্রাক্টরগুলিতে পাস করা প্যারামিটারগুলি পরীক্ষা করার সময় ব্যতিক্রমগুলি ব্যবহার করুন
  • ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করার সময় বা ক্লায়েন্ট কোডটি যখন ব্যতিক্রমী পরিস্থিতি থেকে পুনরুদ্ধার আশা করে তখন ব্যতিক্রমগুলি ব্যবহার করুন
  • যে সমস্যাগুলি দেখা দিতে পারে তার সমাধান করতে ব্যতিক্রমগুলি ব্যবহার করুন
  • প্রাক-শর্তাদি, পোস্ট-কন্ডিশন এবং ব্যক্তিগত / অভ্যন্তরীণ কোডের আক্রমণকারীদের পরীক্ষা করার সময় দৃ as়তাগুলি ব্যবহার করুন
  • নিজের বা আপনার বিকাশকারী দলকে প্রতিক্রিয়া জানাতে দৃ use়তার সাথে ব্যবহার করুন
  • যে জিনিসগুলির খুব সম্ভবত হওয়ার সম্ভাবনা নেই তা পরীক্ষা করার সময় দৃ as়তার সাথে ব্যবহার করুন অন্যথায় এর অর্থ হল যে আপনার অ্যাপ্লিকেশনটিতে মারাত্মক সমস্যা রয়েছে
  • আপনি (অনুমিত) সত্য বলে জানেন এমন জিনিসগুলিকে জানাতে দৃser়তার সাথে ব্যবহার করুন

অন্য কথায়, ব্যতিক্রমগুলি আপনার অ্যাপ্লিকেশনটির দৃust়ত্বকে সম্বোধন করে যখন দৃ its়তাগুলি এর যথার্থতা দেখায়।

লেখাগুলি সস্তা করার জন্য ডিজাইন করা হয়েছে, আপনি এগুলি প্রায় সর্বত্র ব্যবহার করতে পারেন এবং আমি থাম্বের এই নিয়মটি ব্যবহার করছি: একটি দৃ statement় বিবৃতি যত বেশি মূ looks় দেখায়, তত বেশি মূল্যবান এবং এটি আরও বেশি পরিমাণে তথ্য এমবেড করে। এমন কোনও প্রোগ্রামের ডিবাগ করার সময় যা সঠিকভাবে আচরণ করে না, আপনি অবশ্যই আপনার অভিজ্ঞতার ভিত্তিতে আরও স্পষ্ট ব্যর্থতার সম্ভাবনাগুলি পরীক্ষা করবেন। তারপরে আপনি এমন সমস্যাগুলি যাচাই করতে পারবেন যা কেবল ঘটতে পারে না: ঠিক তখনই যখন দৃtions়তাগুলি অনেক সাহায্য করে এবং সময় সাশ্রয় করে।


53
আপনি এটি যেভাবে বলেছিলেন তা আমি পছন্দ করি: ব্যতিক্রমগুলি আপনার অ্যাপ্লিকেশনটির দৃ address়তার সাথে সম্বোধন করে এবং দৃser়তাগুলি এর যথার্থতাটিকে সম্বোধন করে
এম ডুডলি

আমি এটি আমার সাইটে পোস্ট করেছি: pempek.net/articles/2013/11/16/assertions-or- ব্যতিক্রমগুলি
গ্রেগরি পাকোস্জ


26

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

এছাড়াও কোথায় ব্যবহার করতে হবে - বা ব্যবহার করতে হবে না - সুনির্দিষ্টভাবে আরও ক্ষেত্রে দেখতে আপনার দৃsert়তা সম্পর্কে অরাকল নিবন্ধটি পড়া উচিত ।


হিউ হিউ হিউ আমি ভাবছিলাম কেন আমার কোডটি গ্রহনে ব্যর্থ হচ্ছে তবে কমান্ড লাইনে সূক্ষ্ম চলছে।
স্টিভ

15

একটি সাধারণ নিয়ম হিসাবে:

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

আপনার প্রশ্ন থেকে নিম্নলিখিত কোডটি খারাপ শৈলী এবং সম্ভাব্য বগী

try {
    group = service().getGroup("abc");
} catch (Exception e) {
    //i dont log error because i know whenever error occur mean group not found
}

সমস্যাটি হ'ল আপনি জানেন না যে একটি ব্যতিক্রমের অর্থ গ্রুপটি খুঁজে পাওয়া যায় নি। এটাও সম্ভব যে service()কল করবেন তা একটি ব্যতিক্রম তুলে ধরেছে, অথবা এটি ফিরিয়ে দিলাম, যাতে nullযা পরে একটি সৃষ্ট NullPointerException

আপনি যখন "প্রত্যাশিত" ব্যতিক্রমটি ধরেন, আপনি যে ব্যতিক্রমটি প্রত্যাশা করছেন তা কেবল ধরা উচিত । ধরা পড়ে java.lang.Exception(এবং বিশেষত এটি লগ না করে), আপনি সমস্যার সনাক্তকরণ / ডিবাগ করা আরও শক্ত করে তুলছেন এবং সম্ভাব্যত অ্যাপটিকে আরও ক্ষতি করতে দিচ্ছেন।


4

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

ব্যতিক্রমগুলির ব্যবহার সম্পর্কে, যেমন নামটি বলেছে, তাদের ব্যবহারটি ব্যতিক্রমী হওয়া উচিত সুতরাং আপনি উপরে উপস্থাপিত কোডটির জন্য, কোনও পরিষেবা না থাকলে getGroupকলটি ফিরে আসা উচিত null। ব্যতিক্রম কেবল তখনই ঘটে যখন কোনও নেটওয়ার্ক লিঙ্কটি নীচে যায় বা এরকম কিছু হয়।

আমি উপসংহারটি অনুমান করি যে প্রতিটা প্রয়োগের ব্যতিক্রম ব্যতীত সীমা নির্ধারণের জন্য প্রতিটি অ্যাপ্লিকেশনটির জন্য এটি ডেভলপমেন্ট টিমের কাছে কিছুটা ছেড়ে গেছে।


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

হ্যাঁ আপনি ঠিক. এটি একটি গাইডলাইন তবে দিনের শেষে এটি প্রোগ্রামারদের সংবেদনশীলতার জন্য ছেড়ে যায়। আমি মনে করি না যে এগুলির জন্য একটি চূড়ান্ত সংজ্ঞায়িত রেখা আছে সুতরাং আমি অনুমান করি যে আপনি বিভিন্ন কোডের বোঝা পড়ার মাধ্যমে যা সঠিক মনে করেন ঠিক সেটাই নিয়ে যান।
রুই

3

এই দস্তাবেজ অনুসারে http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq- জেনারাল , "দাবী বিবৃতিটি অ-প্রজাতন্ত্র পূর্বশর্ত, পোস্টকন্ডিশন এবং শ্রেণি আগ্রাসনের জন্য উপযুক্ত চেক করা হচ্ছে Public পাবলিক পূর্বশর্ত চেকিংটি এখনও পদ্ধতিগুলির অভ্যন্তরে চেক দ্বারা করা উচিত যা ফলস্বরূপ, নথিভুক্ত ব্যতিক্রম যেমন ইলিজালআরগমেন্টএক্সেপশন এবং ইলিজাল স্টেটএক্সসেপশন। "

পূর্ব শর্ত, পোস্টকন্ডিশন এবং শ্রেণি আক্রমণকারী সম্পর্কে আপনি যদি আরও জানতে চান তবে এই ডকটিটি দেখুন: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions । এটিতে দৃser় ব্যবহারের উদাহরণগুলিও রয়েছে।


1

নাল শুধুমাত্র সমস্যা সৃষ্টি NULLs ফেলবো জন্য টেস্টিং, যেহেতু ব্যবহার করে দেখুন / ধরা আপনি যেমন ফেলবো কোন ত্রুটি ।

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


1

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


1

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

জাভাতে assertions ব্যবহার করে

  1. একটি শর্ত / থ্রো ব্লক লেখার আরও সংক্ষিপ্ত উপায়
  2. আপনাকে JVM পরামিতিগুলির মাধ্যমে এই চেকগুলি চালু / বন্ধ করার অনুমতি দেয়। সাধারণত তারা এই সময়কালের পারফরম্যান্সকে প্রভাবিত না করে বা এর মতো পেনাল্টি না পেলে আমি সব সময় এই চেকগুলি ছেড়ে যাব।

AssertionError রানটাইম এক্সেপশন নয় ত্রুটির একটি সাবক্লাস।
স্টিফেন সি

আহ। অবশ্যই. আমি চেক / চেক না করা সম্পর্কে ভাবছিলাম। এখন সংশোধন করা হয়েছে
ব্রায়ান অ্যাগ্নিউ

এটি ব্যাখ্যাগুলি (বিতর্কিত দৃষ্টিকোণ থেকে) কী কী তা ব্যাখ্যা করে তবে কখন সেগুলি সঠিকভাবে ব্যবহার করা যায় না।
কার্ল রিখটার

1

নীচের লিঙ্কে সূর্যের ডকুমেন্টেশনের বিভাগ 6.1.2 (দাবিগুলি বনাম অন্যান্য ত্রুটি কোড) দেখুন।

http://www.oracle.com/technetwork/articles/javase/javapch06.pdf

এই দস্তাবেজটি সর্বোত্তম পরামর্শ দেয় যা আমি দেখেছি কখন প্রতিবেদনগুলি ব্যবহার করা উচিত। দস্তাবেজ থেকে উদ্ধৃতি:

"থাম্বের একটি ভাল নিয়ম হ'ল আপনি যে ব্যতিক্রমী মামলাগুলি সম্পর্কে ভুলে যেতে চান তার জন্য একটি দৃser়তা ব্যবহার করা উচিত An সাথে ডিল। "


0

দুর্ভাগ্যক্রমে দাবিগুলি অক্ষম করা যায়। উত্পাদনের সময় যখন অপ্রত্যাশিত কোনও কিছু সন্ধানের জন্য আপনাকে যে সমস্ত সহায়তা পেতে পারে সেগুলির প্রয়োজন হয়, তাই নিজেরাই অযোগ্য ঘোষণা করে।

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