চেক করা এবং চেক করা ব্যতিক্রমগুলি কখন চয়ন করবেন


213

জাভাতে (বা অন্য কোনও ভাষা চেক করা ব্যতিক্রম সহ) আপনার নিজস্ব ব্যতিক্রম শ্রেণি তৈরি করার সময়, আপনি এটি কীভাবে পরীক্ষা করবেন বা চেক না করা উচিত তা কীভাবে সিদ্ধান্ত নেবেন?

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


11
ব্যারি রুজেক চেক বা চেক না করা ব্যতিক্রম চয়ন করার জন্য একটি দুর্দান্ত গাইড লিখেছেন ।
অগস্ট

উত্তর:


241

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

চেক করা ব্যতিক্রমগুলি পূর্বাভাসের জন্য ব্যবহার করা উচিত , তবে অপ্রবর্তনীয় ত্রুটিগুলি যা থেকে পুনরুদ্ধার করা যুক্তিসঙ্গত

চেক করা ব্যতিক্রমগুলি অন্য কিছুর জন্য ব্যবহার করা উচিত।

আমি এটি আপনার জন্য ভেঙে দেব, কারণ বেশিরভাগ মানুষ এর অর্থ কী তা বোঝে না।

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

আপনি যে ব্যতিক্রম নিক্ষেপ করছেন তা যদি না উপরের সমস্ত শর্ত পূরণ করে তবে এটি একটি চেক করা ব্যতিক্রম ব্যবহার করা উচিত।

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

উভয় চেক এবং চেক না করা ব্যতিক্রমগুলির জন্য, সঠিক বিমূর্ত স্তরটি ব্যবহার করুন । উদাহরণস্বরূপ, দুটি পৃথক বাস্তবায়ন (ডাটাবেস এবং ফাইল সিস্টেম) সহ একটি কোড সংগ্রহস্থলের প্রয়োগ বা নির্দিষ্ট বিবরণ নিক্ষেপ SQLExceptionবা দ্বারা প্রকাশ করা এড়ানো উচিত IOException। পরিবর্তে, এর ব্যতিক্রমটি একটি বিমূর্ততায় আবৃত করা উচিত যা সমস্ত বাস্তবায়নকে ছড়িয়ে দেয় (উদাঃ RepositoryException)।


2
"আপনি কোনও ফাইল পড়ার চেষ্টা করছেন তবে কেউ এটি উপস্থিত রয়েছে কিনা তা যাচাই করার সময় এবং পঠন অপারেশন শুরু হওয়ার সময়ের মধ্যে এটি মুছে ফেলবে।" => এটি কীভাবে 'প্রত্যাশিত'? আমার কাছে এটি আরও বেশি শোনাচ্ছে: অনাকাঙ্ক্ষিত এবং প্রতিরোধযোগ্য .. কে কেবল 2 স্টেটমেন্টের মধ্যে একটি ফাইল মুছে ফেলার আশা করবে?
Koray Tugay

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

সুতরাং পদ্ধতির মধ্যে কোনও ডাটাবেস-সম্পর্কিত সমস্যা অবশ্যই চেক করা ব্যতিক্রম নিক্ষেপ করতে হবে?
ivanjermakov

59

থেকে একটি জাভা শিক্ষার্থী :

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

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

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


13
এটাই গোঁড়া ভিউ। তবে এটি নিয়ে অনেক বিতর্ক রয়েছে।
আর্টব্রিস্টল

49

আমি যে নিয়মটি ব্যবহার করি তা হ'ল: চেক করা ব্যতিক্রম কখনও ব্যবহার করবেন না! (বা যখন আপনি এর চারপাশে কোনও উপায় দেখতে পাবেন না)

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


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

@ সুপের্যাট মূলত এটি: আমি কঠোর প্রকারের চেকিংয়ের পরীক্ষা-নিরীক্ষার ব্যতিক্রমী এবং এর ব্যতিক্রমী পরীক্ষাগুলি এর যৌক্তিক বর্ধন। আমি চেক ব্যতিক্রমগুলি সম্পূর্ণরূপে ত্যাগ করেছি যদিও আমি ধারণাগতভাবে তাদের অনেক পছন্দ করি।
কনরাড রুডলফ

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

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

1
@ কনরাডরুডল্ফ সুপারক্যাট "কোডের একটি নির্দিষ্ট ব্লক" হিসাবে উল্লেখ করেছে; প্রদত্ত ব্লকটি সংজ্ঞায়িত করতে হবে, ঘোষণামূলক বাক্য গঠনটি ব্লাটকে উল্লেখযোগ্যভাবে হ্রাস করবে না। আপনি যদি ভাবছেন যে এটি পুরো ফাংশনটির জন্য ঘোষিত হবে, এটি খারাপ প্রোগ্রামিংকে উত্সাহিত করবে যেহেতু লোকেরা কেবলমাত্র সম্ভাব্যভাবে ধরা পড়া ব্যতিক্রমগুলি দেখার পরিবর্তে কেবল ঘোষণায় আটকে থাকবে, এবং নিশ্চিত করে তুলবে যে এর চেয়ে ভাল আর কোনও উপায় নেই making তাদের পরিচালনা করতে।
ওয়ারেন

46

যে কোনও বড় পর্যাপ্ত সিস্টেমে, অনেক স্তর সহ, যাচাই করা ব্যতিক্রম যেমন বেহাল হয়, যাইহোক, ব্যতিক্রমটি কীভাবে পরিচালনা করা হবে তা পরিচালনা করার জন্য আপনার একটি স্থাপত্য স্তরের কৌশল প্রয়োজন (ফল্ট বাধা ব্যবহার করুন)

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

বেশিরভাগ সময় আপনি জানেন না যে কোনও ত্রুটি "পুনরুদ্ধারযোগ্য" কিনা কারণ আপনি জানেন না যে আপনার API এর কলারটি কোন স্তরে রয়েছে।

ধরা যাক যে আমি একটি স্ট্রিংটোইন্ট এপিআই তৈরি করি যা একটি পূর্ণসংখ্যার স্ট্রিং প্রতিনিধিত্বকে একটি ইন্টে রূপান্তর করে। যদি API কে "foo" স্ট্রিং দিয়ে ডাকা হয় তবে আমি কি একটি চেক করা ব্যতিক্রম ছুঁড়ে ফেলব? এটি কি পুনরুদ্ধারযোগ্য? আমি জানি না কারণ তার স্তরে আমার স্ট্রিংটোন্ট আইপিএলের কলার ইতিমধ্যে ইনপুটটিকে বৈধতা দিয়েছে এবং যদি এই ব্যতিক্রমটি ছুঁড়ে ফেলা হয় তবে এটি কোনও বাগ বা ডেটা দুর্নীতি হয় এবং এটি এই স্তরের পক্ষে পুনরুদ্ধারযোগ্য নয়।

এক্ষেত্রে এপিআইয়ের কলার ব্যতিক্রমটি ধরতে চায় না। তিনি কেবল ব্যতিক্রমটিকে "বুদ্বুদ আপ" করতে দিতে চান। যদি আমি একটি চেক করা ব্যতিক্রম বেছে নিয়েছি তবে এই কলারটিতে কেবল ব্যতিক্রমটি পুনর্বিবেচনার জন্য প্রচুর অকেজো ক্যাচ ব্লক থাকবে।

যা পুনরুদ্ধারযোগ্য তা বেশিরভাগ সময় এপিআইয়ের কলারের উপর নির্ভর করে, এপিআই-র লিটারের উপরে নয়। কোনও এআইপিআই চেক করা ব্যতিক্রমগুলি ব্যবহার করা উচিত নয় কারণ কেবল চেক করা ব্যতিক্রমগুলি ব্যতিক্রম ধরা বা উপেক্ষা করতে বেছে নিতে পারে ignore


3
এটি ব্যবহারকারীর খুব কাছে .bbspot.com
2008/

16
@ অ্যালেক্সসমেল ইন্টারনেট কখনই আমাকে অবাক করে দিতে ব্যর্থ হয় না, আসলে এটি আমার ব্লগ :)
স্টিফেন

30

আপনি ঠিক বলেছেন।

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

এই ক্ষেত্রে:

/**
 * @params operation - The operation to execute.
 * @throws IllegalArgumentException if the operation is "exit"
 */
 public final void execute( String operation ) {
     if( "exit".equals(operation)){
          throw new IllegalArgumentException("I told you not to...");
     }
     this.operation = operation; 
     .....  
 }
 private void secretCode(){
      // we perform the operation.
      // at this point the opreation was validated already.
      // so we don't worry that operation is "exit"
      .....  
 }

শুধু উদাহরণ দিতে। মুল বক্তব্যটি হ'ল, যদি সিস্টেমটি দ্রুত ব্যর্থ হয় তবে আপনি কোথায় এবং কেন এটি ব্যর্থ হয়েছিল তা জানবেন। আপনি একটি স্ট্যাকট্রেস পাবেন:

 IllegalArgumentException: I told you not to use "exit" 
 at some.package.AClass.execute(Aclass.java:5)
 at otherPackage.Otherlass.delegateTheWork(OtherClass.java:4569)
 ar ......

এবং আপনি কি জানেন যে কি ঘটেছে। "ডেলিগ্রেট দ্য ওয়ার্ক" পদ্ধতিতে (অন্য 4545 লাইন) অনারক্লাস আপনার ক্লাসটিকে "প্রস্থান" মান সহ ডেকেছিল, এমনকি যখন এটি না করা উচিত তখনও etc.

অন্যথায় আপনাকে সমস্ত কোডে বৈধতা ছিটিয়ে দিতে হবে এবং এটি ত্রুটিযুক্ত। এছাড়াও, কখনও কখনও কী ভুল হয়েছে তা ট্র্যাক করা শক্ত এবং আপনি হতাশাবোধক ডিবাগিংয়ের কয়েক ঘন্টা আশা করতে পারেন

নলপয়েন্টারএক্সেপশনগুলির সাথে একই জিনিস ঘটে। আপনার যদি প্রায় 15 টি পদ্ধতি সহ 700 লাইনের বর্গ থাকে তবে 30 টি বৈশিষ্ট্য ব্যবহার করা হয় এবং এগুলির কোনওটিই শূন্য হতে পারে না, পরিবর্তনের জন্য সেই সমস্ত পদ্ধতির প্রতিটিটিতে বৈধতা দেওয়ার পরিবর্তে আপনি এই সমস্ত বৈশিষ্ট্যগুলি কেবল পঠনযোগ্য করতে পারেন এবং সেগুলি কনস্ট্রাক্টরে বৈধ করতে পারেন বা কারখানা পদ্ধতি।

 public static MyClass createInstane( Object data1, Object data2 /* etc */ ){ 
      if( data1 == null ){ throw NullPointerException( "data1 cannot be null"); }

  }


  // the rest of the methods don't validate data1 anymore.
  public void method1(){ // don't worry, nothing is null 
      ....
  }
  public void method2(){ // don't worry, nothing is null 
      ....
  }
  public void method3(){ // don't worry, nothing is null 
      ....
  }

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

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

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

আপনি যদি চেক না করা ব্যতিক্রমকে অতিরিক্ত ব্যবহার করেন তবে অনুরূপ কিছু ঘটবে। এই কোডটির ব্যবহারকারীরা জানেন না যে কিছু ভুল হয়ে যেতে পারে যদি প্রচুর চেষ্টা করে {...} ধরা (থ্রোয়েবল টি) হাজির হয়।


2
ভাল বলেছ! +1 টি। এটি সর্বদা আমাকে অবাক করে দেয় এই পার্থক্যকারী কলার (চেক করা হয়নি) / কলি (চেক করা) আরও সুস্পষ্ট নয় ...
ভোনসি

19

এখানে আমার 'থাম্বের চূড়ান্ত নিয়ম'।
আমি ব্যবহার করি:

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

পূর্বের উত্তরের সাথে তুলনা করুন, এটি এক বা অন্য (বা উভয়) ধরণের ব্যতিক্রম ব্যবহারের জন্য একটি সুস্পষ্ট যুক্তি (যার উপর একমত হতে বা একমত হতে পারে) is


এই ব্যতিক্রম উভয়ের ক্ষেত্রেই আমি খুব সাধারণ অনির্বাচিত ব্যতিক্রম ব্যতীত (আমার কাছে একটি ভাল অনুশীলন, যেমনটি এখানে উল্লেখ করা হয়েছে ) আমার অ্যাপ্লিকেশনটির জন্য আমার নিজস্ব চেক করা এবং চেক করা ব্যতিক্রম তৈরি করব (নালপয়েন্টারএক্সেপশন এর মতো)

সুতরাং উদাহরণস্বরূপ, নীচে এই নির্দিষ্ট ফাংশনটির লক্ষ্য হ'ল একটি বস্তু তৈরি করা (বা ইতিমধ্যে উপস্থিত থাকলে পাওয়া)
যার অর্থ:

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

উদাহরণ:


/**
 * Build a folder. <br />
 * Folder located under a Parent Folder (either RootFolder or an existing Folder)
 * @param aFolderName name of folder
 * @param aPVob project vob containing folder (MUST NOT BE NULL)
 * @param aParent parent folder containing folder 
 *        (MUST NOT BE NULL, MUST BE IN THE SAME PVOB than aPvob)
 * @param aComment comment for folder (MUST NOT BE NULL)
 * @return a new folder or an existing one
 * @throws CCException if any problems occurs during folder creation
 * @throws AssertionFailedException if aParent is not in the same PVob
 * @throws NullPointerException if aPVob or aParent or aComment is null
 */
static public Folder makeOrGetFolder(final String aFoldername, final Folder aParent,
    final IPVob aPVob, final Comment aComment) throws CCException {
    Folder aFolderRes = null;
    if (aPVob.equals(aParent.getPVob() == false) { 
       // UNCHECKED EXCEPTION because the caller failed to live up
       // to the documented entry criteria for this function
       Assert.isLegal(false, "parent Folder must be in the same PVob than " + aPVob); }

    final String ctcmd = "mkfolder " + aComment.getCommentOption() + 
        " -in " + getPNameFromRepoObject(aParent) + " " + aPVob.getFullName(aFolderName);

    final Status st = getCleartool().executeCmd(ctcmd);

    if (st.status || StringUtils.strictContains(st.message,"already exists.")) {
        aFolderRes = Folder.getFolder(aFolderName, aPVob);
    }
    else {
        // CHECKED EXCEPTION because the callee failed to respect his contract
        throw new CCException.Error("Unable to make/get folder '" + aFolderName + "'");
    }
    return aFolderRes;
}

19

এটি কেবল ব্যতিক্রম থেকে পুনরুদ্ধার করার যোগ্যতার বিষয় নয়। সবচেয়ে গুরুত্বপূর্ণ, আমার মতে, কলার ব্যতিক্রমটি ধরতে আগ্রহী কিনা তা whether

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

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

যাইহোক, বেশিরভাগ সময় ব্যাক্তির কলারের আগ্রহ ব্যতিক্রম থেকে পুনরুদ্ধার করার দক্ষতার সাথে সরাসরি সম্পর্কযুক্ত তবে এটি সর্বদা ক্ষেত্রে হয় না।


13

আপনার চেক করা / চেক না করা সমস্যার জন্য এখানে খুব সহজ সমাধান।

বিধি 1: কোড কার্যকর হওয়ার আগে একটি পরীক্ষণযোগ্য শর্ত হিসাবে একটি চেক করা ব্যতিক্রম সম্পর্কে ভাবেন। উদাহরণ স্বরূপ…

x.doSomething(); // the code throws a NullPointerException

যেখানে এক্স নাল ... ... কোডটিতে নিম্নলিখিতটি থাকা উচিত ...

if (x==null)
{
    //do something below to make sure when x.doSomething() is executed, it won’t throw a NullPointerException.
    x = new X();
}
x.doSomething();

বিধি 2: কোডটি কার্যকর করার সময় ঘটতে পারে এমন একটি অ-পরীক্ষামূলক শর্ত হিসাবে একটি পরীক্ষিত ব্যতিক্রমটিকে ভাবুন।

Socket s = new Socket(“google.com”, 80);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();

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

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

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

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

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

উপরের 2 টি নিয়মগুলি সম্ভবত আপনার 90% উদ্বেগকে বেছে নেবে যা থেকে বেছে নেওয়া উচিত। নিয়মগুলির সংক্ষিপ্তসার হিসাবে, এই প্যাটার্নটি অনুসরণ করুন ... 1) যদি কার্যকর করা কোডটি সঠিকভাবে চালিত হওয়ার আগে এটি পরীক্ষা করা যায় এবং যদি কোনও ব্যতিক্রম ঘটে - যদি কোনও প্রোগ্রামার ত্রুটি হয়, ব্যতিক্রমটি একটি চেক করা ছাড়াই হওয়া উচিত (রানটাইম এক্সেকসেপ্টের একটি সাবক্লাস) )। ২) কার্যকর করা কোডটি যদি সঠিকভাবে চালিত হওয়ার জন্য এটি কার্যকর করা হয় তার আগে যদি এটি পরীক্ষা না করা যায় তবে ব্যতিক্রমটি একটি চেক করা ব্যতিক্রম (ব্যতিক্রমের একটি সাবক্লাস) হওয়া উচিত।


9

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


1
+1 উল্লেখ করার জন্য যে ইউনিট পরীক্ষাগুলি সমস্যা সমাধানের আরও ভাল উপায় হতে পারে যাচাই করা ব্যতিক্রমগুলি সমাধানের উদ্দেশ্যে।
কিথ পিনসন

ইউনিট পরীক্ষার জন্য +1। পরীক্ষিত / চেক না করা ব্যতিক্রমগুলি কোডের মানের উপর খুব কম প্রভাব ফেলবে। সুতরাং যুক্তি যে কেউ যদি পরীক্ষিত ব্যতিক্রমগুলি ব্যবহার করে তবে এটির ফলে আরও ভাল কোডের মানটি সম্পূর্ণ বোগাস আর্গুমেন্ট হয়!
ব্যবহারকারী1697575

7

চেক করা ব্যতিক্রম: যদি ক্লায়েন্ট কোনও ব্যতিক্রম থেকে পুনরুদ্ধার করতে পারে এবং চালিয়ে যেতে চান, তবে চেক করা ব্যতিক্রম ব্যবহার করুন।

চেক না করা ব্যতিক্রম: যদি কোনও ক্লায়েন্ট ব্যতিক্রমের পরে কোনও কাজ করতে না পারে তবে চেক করা ব্যতিক্রমগুলি বাড়ান।

উদাহরণ: আপনি যদি পদ্ধতি A () এ পাটিগণিতের অপারেশন এবং এ () থেকে আউটপুটের উপর ভিত্তি করে প্রত্যাশিত হন তবে আপনাকে অন্য অপারেশন করতে হবে। যদি রান এ সময় আপনি আশা করেন না এমন পদ্ধতি A () থেকে আউটপুট যদি শূন্য হয়, তবে আপনি নাল পয়েন্টার ব্যতিক্রম নিক্ষেপ করবেন বলে চালানো সময় ব্যতিক্রম is

পড়ুন এখানে


2

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

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


2

বিকাশের বহু বছরের অভিজ্ঞতার পরে আমি আমার মতামতটি এখানে ভাগ করে নিতে চাই:

  1. ব্যতিক্রম পরীক্ষা করা হয়েছে। এটি ব্যবসায়িক ব্যবহারের ক্ষেত্রে বা কল প্রবাহের একটি অংশ, এটি আমরা প্রত্যাশা করি বা প্রত্যাশা করি না এমন অ্যাপ্লিকেশন যুক্তির একটি অংশ। উদাহরণস্বরূপ সংযোগ প্রত্যাখাত হয়েছে, শর্তটি সন্তুষ্ট নয় etc. আমাদের এটি পরিচালনা করতে হবে এবং কী ঘটেছে এবং পরবর্তী কী করা উচিত নির্দেশাবলী সহ ব্যবহারকারীকে সংশ্লিষ্ট বার্তা প্রদর্শন করতে হবে (পরে আবার চেষ্টা করুন ইত্যাদি)। আমি সাধারণত এটিকে পোস্ট-প্রসেসিং ব্যতিক্রম বা "ব্যবহারকারী" ব্যতিক্রম বলি।

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

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

  1. ব্যতিক্রম পরীক্ষা করা হয়েছে। লক্ষ্য শ্রোতা ব্যবহারকারী / ক্লায়েন্ট।
  2. চেক করা ব্যতিক্রম লক্ষ্য দর্শকদের বিকাশকারী। অন্য কথায় চেক করা ব্যতিক্রমগুলি কেবল বিকাশকারীদের জন্য ডিজাইন করা হয়েছে।

অ্যাপ্লিকেশন বিকাশ দ্বারা জীবনচক্র পর্যায়ে।

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

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


2

প্রোগ্রামার ত্রুটি কিনা তা ভিত্তিতে আমাদের এই দুটি ধরণের ব্যতিক্রমকে আলাদা করতে হবে।

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

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

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

আপনি যদি একটি স্তরযুক্ত এন্টারপ্রাইজ সিস্টেম বিকাশ করেন তবে আপনাকে নিক্ষেপ করার জন্য বেশিরভাগ চেক করা ব্যতিক্রম বেছে নিতে হবে, তবে আপনি কিছু করতে পারবেন না এমন ক্ষেত্রে চেক করা ব্যতিক্রম ব্যবহার করতে ভুলবেন না।


1

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

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


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

1

যার ব্যতিক্রমটি সম্ভবত কম প্রত্যাশিত, এবং আমরা এটি ধরার পরেও এগিয়ে যেতে পারি এবং সেই ব্যতিক্রমটি এড়াতে আমরা কিছুই করতে পারি না তবে আমরা পরীক্ষিত ব্যতিক্রমটি ব্যবহার করতে পারি।

যখনই আমরা কোনও নির্দিষ্ট ব্যতিক্রম ঘটে এবং যখন ব্যতিক্রম প্রত্যাশিত তবে নিশ্চিত না হয় অর্থবহ কিছু করতে চাই তখন আমরা পরীক্ষিত ব্যতিক্রম ব্যবহার করতে পারি।

যখনই ব্যতিক্রমগুলি বিভিন্ন স্তরগুলিতে নেভিগেট হয়, আমাদের প্রতিটি স্তরে এটি ধরার দরকার নেই, সে ক্ষেত্রে আমরা রানটাইম ব্যতিক্রম বা মোড়ক ব্যতিক্রমটিকে চেক করা ব্যতিক্রম হিসাবে ব্যবহার করতে পারি।

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

আরও সাধারণ ব্যতিক্রমগুলি চেক করা যায় না, কম সাধারণ পরীক্ষা করা হয়।


1

আমি মনে করি আমরা বেশ কয়েকটি প্রশ্ন থেকে নিষেধাজ্ঞাগুলি সম্পর্কে ভাবতে পারি:

নিষেধাজ্ঞার ঘটনা ঘটে কেন? এটি ঘটলে আমরা কী করতে পারি

ভুল করে, একটি বাগ যেমন নাল বস্তুর একটি পদ্ধতি বলা হয়।

String name = null;
... // some logics
System.out.print(name.length()); // name is still null here

পরীক্ষার সময় এই জাতীয় ব্যতিক্রম স্থির করা উচিত। অন্যথায়, এটি উত্পাদনটি ভেঙে দেয় এবং আপনি একটি খুব উচ্চ বাগ পেয়েছিলেন যা অবিলম্বে ঠিক করা দরকার। এই জাতীয় ব্যতিক্রমগুলি পরীক্ষা করার প্রয়োজন নেই।

বাহ্যিক থেকে ইনপুট দ্বারা, আপনি বাহ্যিক পরিষেবার আউটপুট নিয়ন্ত্রণ বা বিশ্বাস করতে পারবেন না।

String name = ExternalService.getName(); // return null
System.out.print(name.length());    // name is null here

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

বাহ্যিক থেকে রানটাইম ব্যতিক্রম দ্বারা, আপনি বাহ্যিক পরিষেবা নিয়ন্ত্রণ বা বিশ্বাস করতে পারবেন না।

এখানে, আপনি যদি বাহ্যিক পরিষেবা থেকে সমস্ত ব্যতিক্রমগুলি ধরতে চান তবে যদি এটি ঘটে থাকে চালিয়ে যেতে চান, অন্যথায়, আপনি এটিকে একা ছেড়ে দিতে পারেন এবং এটি এখানে থামবে এবং কলারকে রানটাইম ব্যতিক্রম দেয়।

বাহ্যিক থেকে ব্যতিক্রম চেক করে আপনি বাহ্যিক পরিষেবা নিয়ন্ত্রণ বা বিশ্বাস করতে পারবেন না।

এখানে, আপনি যদি বাহ্যিক পরিষেবা থেকে সমস্ত ব্যতিক্রমগুলি ধরতে চান তবে যদি এটি ঘটে থাকে চালিয়ে যেতে চান, অন্যথায়, আপনি এটিকে একা ছেড়ে দিতে পারেন এবং এটি এখানে থামবে এবং কলারকে রানটাইম ব্যতিক্রম দেয়।

এই ক্ষেত্রে, আমাদের কী জানতে হবে যে এক্সটার্নাল সার্ভিসে কোন ধরণের ব্যতিক্রম ঘটেছে? এটা নির্ভর করে:

  1. আপনি যদি কিছু ধরণের ব্যতিক্রম পরিচালনা করতে পারেন তবে আপনাকে সেগুলি ধরতে হবে এবং প্রক্রিয়া করতে হবে। অন্যদের জন্য, তাদের বুদ্বুদ।

  2. আপনার যদি নির্দিষ্ট নির্বাহের লগ বা প্রতিক্রিয়ার প্রয়োজন হয় তবে আপনি সেগুলি ধরতে পারেন। অন্যদের জন্য, তাদের বুদ্বুদ।


0

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


-12

আমি যে নিয়মটি ব্যবহার করি তা হ'ল: চেক করা ব্যতিক্রম কখনও ব্যবহার করবেন না! (বা যখন আপনি এর চারপাশে কোনও উপায় দেখতে পাবেন না)

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

অ্যাপ্লিকেশন পুরোপুরি অদৃশ্য হয়ে যাওয়ার পরিবর্তে শেষ ব্যবহারকারীটিকে ত্রুটি বার্তা সহ এখনও উপস্থাপন করা যেতে পারে।


1
বেশিরভাগ চেক করা ব্যতিক্রম ব্যতীত ক্যাচ-অল যা আপনার মনে হয় তা আপনি ব্যাখ্যা করবেন না।
ম্যাথু ফ্ল্যাশেন

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