চেক করা ব্যতিক্রমগুলির বিরুদ্ধে মামলা


456

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

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

আমার প্রতিটি কথোপকথন একই প্রশ্নের উত্তর ছাড়াই শেষ হয়েছে ... আমাকে এটি সেট আপ করতে দিন:

সাধারণভাবে (জাভা কীভাবে ডিজাইন করা হয়েছিল) থেকে,

  • Error কখনও এমন জিনিসগুলির জন্য যা কখনই ধরা পড়বে না (ভিএম এর একটি চিনাবাদামের অ্যালার্জি রয়েছে এবং কেউ এর উপর চিনাবাদামের একটি জার ফেলে দিয়েছেন)
  • RuntimeException প্রোগ্রামারটি যে ভুল কাজ করেছিল সেগুলির জন্য (প্রোগ্রামার একটি অ্যারের শেষে চলে গেল)
  • Exception (-setup RuntimeException ) প্রোগ্রামারের নিয়ন্ত্রণের বাইরে থাকা জিনিসগুলির জন্য (ফাইল সিস্টেমে লেখার সময় ডিস্ক পূরণ হয়, প্রক্রিয়াটির জন্য ফাইল হ্যান্ডেল সীমাটি পৌঁছে গেছে এবং আপনি আর কোনও ফাইল খুলতে পারবেন না)
  • Throwable কেবল ব্যতিক্রম ধরণের সমস্তের পিতামাতা।

একটি সাধারণ যুক্তি যা আমি শুনি তা হ'ল যদি কোনও ব্যতিক্রম ঘটে তবে সমস্ত বিকাশকারী যা করতে যাচ্ছেন তা হল প্রোগ্রামটি থেকে প্রস্থান করা।

আরেকটি সাধারণ যুক্তি যা আমি শুনি তা হ'ল চেক করা ব্যতিক্রমগুলি রিফ্যাক্টর কোডটিকে আরও শক্ত করে তোলে।

"আমি যা করতে যাচ্ছি তা হ'ল প্রস্থান" আর্গুমেন্টের জন্য আমি বলছি যে আপনি যদি প্রস্থান করেও আপনার যুক্তিসঙ্গত ত্রুটি বার্তা প্রদর্শন করা দরকার। আপনি যদি কেবল ত্রুটিগুলি পরিচালনা করার জন্য ঝাঁপিয়ে পড়ে থাকেন তবে প্রোগ্রামটি কেন বাইরে চলেছে তা কেন তার স্পষ্ট ইঙ্গিত ছাড়াই অতিরিক্ত ব্যবহারকারীরা খুব বেশি খুশি হবেন না।

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

মেইনটিকে মোড়ানো catch(Exception)(বা কিছু ক্ষেত্রে) নিয়ে আমার কোনও সমস্যা নেইcatch(Throwable) প্রোগ্রামটি নিখুঁতভাবে প্রস্থান করতে পারে তা নিশ্চিত করার জন্য - তবে আমার প্রয়োজনীয় সুনির্দিষ্ট ব্যতিক্রমগুলি আমি সর্বদা গ্রহণ করি Do এটি করা আমাকে খুব কমপক্ষে কোনও উপযুক্ত প্রদর্শন করতে দেয় ভুল বার্তা.

লোকেরা যে প্রশ্নের উত্তর দেয় না তা হ'ল:

আপনি যদি RuntimeException সাবক্লাসের পরিবর্তে সাবক্ল্যাস ফেলে দেন Exception তবে কীভাবে আপনি জানেন যে আপনি কী ধরবেন?

উত্তরটি ধরা পড়লে Exception তবে আপনি সিস্টেম ব্যতিক্রমগুলির মতো প্রোগ্রামার ত্রুটিগুলিও একইভাবে পরিচালনা করছেন। এটা আমার কাছে ভুল বলে মনে হচ্ছে

আপনি যদি ধরেন Throwableতবে আপনি সিস্টেম ব্যতিক্রম এবং ভিএম ত্রুটিগুলি (এবং এর মতো) একইভাবে চিকিত্সা করছেন। এটা আমার কাছে ভুল বলে মনে হচ্ছে

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

আমি বলব যে একটি প্রোগ্রাম যা স্ট্যাক ট্রেস প্রদর্শন করে তা ভুল। যে সমস্ত লোক চেক করা ব্যতিক্রম পছন্দ করেন না তারা কী সেভাবে অনুভব করেন না?

সুতরাং, আপনি যদি চেক করা ব্যতিক্রম পছন্দ না করেন তবে আপনি কেন ব্যাখ্যা করতে পারেন এবং কেন উত্তর দেওয়া হয় না এমন প্রশ্নের উত্তর দিন না দয়া করে?

সম্পাদনা করুন: কোন মডেলটি কখন ব্যবহার করবেন সে সম্পর্কে আমি পরামর্শ খুঁজছি না, আমি যা খুঁজছি তা হল লোকেরা কেন বাড়াতে RuntimeExceptionপছন্দ করে কারণ তারা তার থেকে প্রসারিত করতে পছন্দ করে না Exceptionএবং / অথবা তারা কেন একটি ব্যতিক্রম ধরা পড়ে এবং তারপরে RuntimeExceptionনিক্ষেপ যুক্ত করার পরিবর্তে পুনর্বিবেচনা করে তাদের পদ্ধতি। আমি চেক করা ব্যতিক্রম অপছন্দ করার প্রেরণা বুঝতে চাই।


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

6
চলে আসো. একটি ভাষা বৈশিষ্ট্য হিসাবে দেখা হয়েছে, এই বিষয়টি হয়েছে এবং উদ্দেশ্যমূলক উপায়ে যোগাযোগ করা যেতে পারে।
কর্ট শেলফথআউট

6
@ ক্লেটাস "আপনার নিজের প্রশ্নের উত্তর দিচ্ছেন" আমার কাছে উত্তর থাকলে আমি প্রশ্ন জিজ্ঞাসা করতাম না!
তোফুবিয়ার

8
দুর্দান্ত প্রশ্ন। সি ++ তে কোনও চেক করা ব্যতিক্রম মোটেও নেই এবং আমার মতে এটি ব্যতিক্রম বৈশিষ্ট্যটি অব্যর্থ রেন্ডার করে। আপনি এমন পরিস্থিতিতে পৌঁছেছেন যেখানে আপনার করা প্রতিটি ফাংশন কলকে আপনার চারপাশে একটি ক্যাচ রাখতে হবে, কারণ এটি কিছু ফেলতে পারে কিনা তা আপনি জানেন না।
দিমিত্রি সি

4
যাচাই করা ব্যাতিক্রমগুলির জন্য আমি সবচেয়ে দৃ argument় যুক্তিটি জানি যে তারা মূলত জাভাতে ছিল না এবং তাদের পরিচয় করার সাথে সাথে তারা জেডিকে কয়েকশত বাগ আবিষ্কার করেছিল। এটি জাভা 1.0 এর কিছুটা আগে। আমি ব্যক্তিগতভাবে তাদের ছাড়া থাকব না, এবং ব্রুস এক্কেল এবং এই বিষয়ে অন্যদের সাথে সহিংসতার সাথে একমত নই।
মারকুইস

উত্তর:


276

আমি মনে করি আপনি একই ব্রুস একেল সাক্ষাত্কারটি পড়েছিলেন - এবং এটি আমাকে সর্বদা বগল করে তোলে। প্রকৃতপক্ষে, যুক্তিটি ইন্টারভিউওয়ালির দ্বারা করা হয়েছিল (এটি যদি আপনি প্রকৃতপক্ষে পোস্টের কথা বলছেন) আন্ডার হেজলসবার্গ, এমএসের প্রতিভা .NET এবং C # এর পিছনে।

http://www.artima.com/intv/handcuffs.html

অনুরাগী যদিও আমি হিজলসবার্গ এবং তার কাজের মধ্যে আছি, এই যুক্তি আমাকে সর্বদা বগু হিসাবে আঘাত করেছে। এটি মূলত:

"চেক করা ব্যতিক্রমগুলি খারাপ কারণ প্রোগ্রামাররা তাদের সর্বদা তাদের ধরে ফেলে এবং বরখাস্ত করার মাধ্যমে কেবল তাদের অপব্যবহার করে যা সমস্যাগুলি গোপনে এবং উপেক্ষা করার দিকে পরিচালিত করে যা অন্যথায় ব্যবহারকারীর সামনে উপস্থাপিত হবে"।

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

যুক্তির সারাংশ সারসংক্ষেপ যে "প্রোগ্রামাররা সঠিকভাবে এবং ব্যবহার করে সেগুলি সঠিকভাবে তাদের হচ্ছে না চেয়ে খারাপ তাদের ব্যবহার করবে না"

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

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

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

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

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

সি তে বুদ্ধিমান কিছু যায়

  if (f = fopen("goodluckfindingthisfile")) { ... } 
  else { // file not found ...

যেখানে fopen0 এবং সি ফিরে আসার ব্যর্থতা নির্দেশ করে (বোকামি) আপনাকে 0 কে বুলিয়ান হিসাবে আচরণ করতে দেয় এবং ... মূলত, আপনি এই প্রতিমাটি শিখেন এবং আপনি ঠিক আছেন। তবে আপনি যদি নূব হন এবং আপনি প্রতিমাটি শিখেন না তবে কী হবে। তারপরে, অবশ্যই, আপনি শুরু করে দিন

   f = fopen("goodluckfindingthisfile");
   f.read(); // BANG! 

এবং হার্ড উপায় শিখুন।

মনে রাখবেন যে আমরা এখানে দৃ strongly়ভাবে টাইপ করা ভাষাগুলি সম্পর্কে কথা বলছি: একটি API টি দৃ strongly়ভাবে টাইপ করা ভাষায় কী তা সম্পর্কে একটি স্পষ্ট ধারণা রয়েছে: এটি প্রতিটিটির জন্য একটি স্পষ্টভাবে সংজ্ঞায়িত প্রোটোকল ব্যবহার করার জন্য এটি কার্যকারিতা (পদ্ধতি) এর স্মর্গাসর্ড।

যে পরিষ্কারভাবে সংজ্ঞায়িত প্রোটোকল সাধারণত একটি পদ্ধতি স্বাক্ষর দ্বারা সংজ্ঞায়িত করা হয়। এখানে ফোপেনের জন্য আপনার এটি স্ট্রিং (বা সি এর ক্ষেত্রে একটি চর *) পাস করার প্রয়োজন pass আপনি যদি এটি অন্য কিছু দেন তবে আপনি একটি সংকলন-সময় ত্রুটি পান। আপনি প্রোটোকলটি অনুসরণ করেননি - আপনি এপিআই সঠিকভাবে ব্যবহার করছেন না।

কিছু (অস্পষ্ট) ভাষায় রিটার্নের ধরণটি প্রোটোকলেরও একটি অংশ। যদি আপনি সমতুল্য কল করতে চেষ্টা করুনfopen() কোনও ভেরিয়েবলকে না বরাদ্দ করে কিছু ভাষায় একটি সংকলন-সময় ত্রুটিও পাবেন (আপনি কেবল এটি শূন্য ফাংশন দিয়ে করতে পারেন)।

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

(রুবির মতো গতিসম্পন্ন টাইপিত ভাষায়, আপনি ফাইলের নাম হিসাবে কোনও ফ্লোট বলতে পারেন, এটি কোনও সংকেত দিতে পারেন - এবং এটি সংকলন করবে you're আপনি এমনকি যদি পদ্ধতিটির তর্কগুলি নিয়ন্ত্রণ নাও করেন তবে চেক করা ব্যতিক্রম কেন ব্যবহারকারীকে ঝামেলা করছেন The এখানে তৈরি আর্গুমেন্টগুলি কেবল স্ট্যাটিস্টিকাল-টাইপ করা ভাষাগুলিতেই প্রযোজ্য))

সুতরাং, চেক ব্যতিক্রম সম্পর্কে কি?

ঠিক আছে এখানে জাভা এপিআইগুলির মধ্যে একটি আপনি একটি ফাইল খোলার জন্য ব্যবহার করতে পারেন।

try {
  f = new FileInputStream("goodluckfindingthisfile");
}
catch (FileNotFoundException e) {
  // deal with it. No really, deal with it!
  ... // this is me dealing with it
}

সেই ধর দেখি? এখানে সেই এপিআই পদ্ধতির স্বাক্ষর রয়েছে:

public FileInputStream(String name)
                throws FileNotFoundException

লক্ষ্য করুন FileNotFoundExceptionএকটি হল চেক করা ব্যতিক্রম।

এপিআই প্রোগ্রামার আপনাকে এটি বলছে: "আপনি এই কনস্ট্রাক্টরটি একটি নতুন ফাইলআইপুট স্ট্রিম তৈরি করতে ব্যবহার করতে পারেন তবে আপনি

ক) ফাইলের নাম অবশ্যই স্ট্রিং হিসাবে পাস করতে হবে
খ) অবশ্যই রানটাইমের সময় ফাইলটি খুঁজে পাওয়া না যাওয়ার সম্ভাবনা গ্রহণ করতে হবে "

এবং এটি যতটা আমি উদ্বিগ্ন পুরো বিষয়টি।

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

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

সুতরাং এপিআই এটিকে স্পষ্ট করে তুলেছে: আপনি আমাকে ফোন করার সময় এই ফাইলটির অস্তিত্ব নেই এমন ঘটনাও ঘটবে এবং এর সাথে আপনি আরও ভাল ব্যবহার করতে পারেন।

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

public RowData getRowData(int row) 

এখন আমি একটি এপিআই প্রোগ্রামার হিসাবে জানি যে কয়েকটি ক্ষেত্রে ক্লায়েন্ট সারণির বাইরে একটি সারি বা একটি সারি মানের জন্য নেতিবাচক মান পাস করে cases সুতরাং আমি একটি পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলতে এবং ক্লায়েন্টকে এটি মোকাবেলা করতে বাধ্য করতে পারি:

public RowData getRowData(int row) throws CheckedInvalidRowNumberException

(আমি অবশ্যই এটি অবশ্যই "চেকড" বলব না))

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

এপিআই প্রোগ্রামারটি এখনও ভবিষ্যদ্বাণী করতে পারে যে ক্লায়েন্ট এই জাতীয় বাগগুলি কোড করবে এবং এটির মতো একটি রানটাইম ব্যতিক্রম সহ এটি পরিচালনা করা উচিত IllegalArgumentException

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

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

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

  1. ক্লায়েন্টের নিয়ন্ত্রণের বাইরে বা ক্লোজড বনাম ওপেন:

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

  2. সর্বব্যাপিতা:

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

    if (model.getRowData().getCell(0).isEmpty())

    এবং প্রতিবার চেষ্টা / ক্যাপচারের মধ্যে আবদ্ধ থাকা বেদনাদায়ক হবে।

  3. ব্যবহারকারীকে অবহিত করা:

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

    "Error: could not find the file 'goodluckfindingthisfile'"

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

    "Internal error occured: IllegalArgumentException in ...."

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

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

দুঃখিত, এটিকে এত দীর্ঘ এবং হালকাভাবে তৈরি করার অর্থ নয় আমাকে দুটি পরামর্শ দিয়ে শেষ করুন:

উত্তর: এপিআই প্রোগ্রামারস: তাদের কার্যকারিতা সংরক্ষণের জন্য পরীক্ষিত ব্যতিক্রমগুলি অল্প পরিমাণে ব্যবহার করুন। সন্দেহ হলে একটি চেক করা ব্যতিক্রম ব্যবহার করুন।

বি: ক্লায়েন্ট প্রোগ্রামারস: আপনার বিকাশের প্রথম দিকে একটি মোড়ানো ব্যতিক্রম (গুগল এটি) তৈরি করার অভ্যাসটি গ্রহণ করুন। JDK 1.4 এবং পরবর্তীকালে এটির RuntimeExceptionজন্য একটি কনস্ট্রাক্টর সরবরাহ করুন , তবে আপনি খুব সহজেই নিজের তৈরি করতে পারেন। এখানে কনস্ট্রাক্টর:

public RuntimeException(Throwable cause)

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

try {
  overzealousAPI(thisArgumentWontWork);
}
catch (OverzealousCheckedException exception) {
  throw new RuntimeException(exception);  
}

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

catch (Exception e) { /* TODO deal with this at some point (yeah right) */}

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

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

23
@ রবার্ব: +1, খুব আকর্ষণীয় উত্তর, উভয় পক্ষের পক্ষে যুক্তি দেখায়। গ্রেট। আপনার শেষ মন্তব্য সম্পর্কে: নোট করুন যে কল স্ট্যাকের প্রতিটি পদ্ধতিতে ছোঁড়াছুড়ি ঘোষণা সর্বদা সম্ভব নাও হতে পারে, বিশেষত যদি আপনি পথে ইন্টারফেস প্রয়োগ করছেন।
আর মার্টিনহো ফার্নান্দেস

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

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

184

পরীক্ষিত ব্যতিক্রমগুলির বিষয় হ'ল ধারণাটির সাধারণ বোঝার দ্বারা তারা সত্যিকারের ব্যতিক্রম নয়। পরিবর্তে, তারা এপিআই বিকল্প ফিরতি মান।

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

public [int or IOException] writeToStream(OutputStream stream) {
    [void or IOException] a= stream.write(mybytes);
    if (a instanceof IOException)
        return a;
    return mybytes.length;
}

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

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

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

  1. অহেতুক সংযোজন বৃদ্ধি;
  2. ইন্টারফেসের স্বাক্ষরগুলি পরিবর্তন করতে খুব ভঙ্গুর করে তোলে;
  3. কোডটি কম পঠনযোগ্য করে তোলে;
  4. এত বিরক্তিকর যে সাধারণ প্রোগ্রামার প্রতিক্রিয়া হ'ল 'থ্রো এক্সপশন', 'ক্যাচ (এক্সপশন ই) {}' এর মতো ভয়ঙ্কর কিছু করে সিস্টেমকে পরাজিত করা বা রানটাইম এক্সেকসেপশন (যা ডিবাগিংকে আরও শক্ত করে তোলে) এর মধ্যে সবকিছু মোড়ানো।

এবং তারপরে এখানে প্রচুর হাস্যকর লাইব্রেরি ব্যতিক্রম রয়েছে:

try {
    httpconn.setRequestMethod("POST");
} catch (ProtocolException e) {
    throw new CanNeverHappenException("oh dear!");
}

আপনি যখন নিজের কোডটিকে এইভাবে হাস্যকর ক্রুডের সাথে ঝাঁকুনিতে ফেলেছেন তখন অবাক হওয়ার কিছু নেই যে চেক করা ব্যতিক্রমগুলি ঘৃণার একগুচ্ছ পান, যদিও এটি সত্যই সহজ দুর্বল API নকশা design

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

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


14
আপনার কোড উদাহরণে, ব্যতিক্রমগুলি শৃঙ্খল করা ভাল হবে যাতে লগগুলি পড়ার সময় আসল কারণটি পাওয়া যায়: CanNeverHappenException (e) নিক্ষেপ করুন;
এসকো লুন্তটোলা

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

15
@ মিস্টার: আমি যা বলছি তা হ'ল জাভাতে প্রয়োগ করা হিসাবে পরীক্ষা করা ব্যতিক্রমগুলি বাস্তবে, সি -++ এবং অন্যান্য প্রাক-জাভা ভাষাগুলি থেকে আমরা যে traditionalতিহ্যগত 'ব্যতিক্রমগুলি' চিনতে পারি তার চেয়ে সি হিসাবে রিটার্নের মানগুলির মতো আচরণ করে। এবং এই আইএমও এটি সত্যিই বিভ্রান্তি এবং দুর্বল নকশার দিকে নিয়ে যায়।
ববিনস

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

14
"এপিআই বিকল্প ফেরত মান" জন্য +1 1 চেক করা ব্যতিক্রমগুলি দেখার আকর্ষণীয় উপায়।
Zsolt Török

75

চেক করা ব্যতিক্রমগুলির বিরুদ্ধে সমস্ত (বহু) কারণ পুনঃনির্মাণ করার পরিবর্তে আমি কেবল একটি বেছে নেব। কোডের এই ব্লকটি আমি কতবার লিখেছি তার সংখ্যা গণনা আমি হারিয়ে ফেলেছি:

try {
  // do stuff
} catch (AnnoyingcheckedException e) {
  throw new RuntimeException(e);
}

99% সময় আমি এটি সম্পর্কে কিছুই করতে পারি না। অবশেষে ব্লকগুলি কোনও প্রয়োজনীয় পরিচ্ছন্নতা করে (বা কমপক্ষে তাদের উচিত) should

আমি এটি যতবার দেখেছি তার সংখ্যাও হারিয়েছি:

try {
  // do stuff
} catch (AnnoyingCheckedException e) {
  // do nothing
}

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

এবং তারপরে আমাদের কাছে জ্বালানী কোড রয়েছে যা java.text. Format এর মতো প্রবাহ নিয়ন্ত্রণের ফর্ম হিসাবে ব্যতিক্রমগুলি ব্যবহার করে . করেBzzzt। ভুল। কোনও ব্যবহারকারী একটি ফর্মের একটি নম্বর ক্ষেত্রে "abc" স্থাপন করা ব্যতিক্রম নয়।

ঠিক আছে, আমি অনুমান করি যে তিনটি কারণ ছিল।


4
তবে যদি কোনও ব্যতিক্রম সঠিকভাবে ধরা হয় তবে আপনি ব্যবহারকারীকে জানাতে পারেন, অন্যান্য কাজগুলি (লগ?) করতে পারেন এবং একটি নিয়ন্ত্রিত উপায়ে অ্যাপ্লিকেশনটি প্রস্থান করতে পারেন। আমি সম্মত যে কিছু এপিআই অংশগুলি আরও ভালভাবে ডিজাইন করা যেতে পারে। এবং অলস প্রোগ্রামার কারণে, ভাল, আমি মনে করি একটি প্রোগ্রামার হিসাবে আপনি আপনার কোডের জন্য 100% দায়বদ্ধ।
মিস্টার স্মিথ

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

15
আমি মনে করি যে খালি ক্যাচ ব্লকটি আপনি দেখেছেন তার জন্য অ্যালিপিসের মতো আইডিইগুলিতে অনেক দোষ রয়েছে। সত্যই, তাদের ডিফল্টরূপে পুনর্বিবেচনা করা উচিত।
আর্টব্রিস্টল

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

2
@ ইয়াসমানি ল্লেনেস আপনি সবসময় এই জিনিসগুলি করতে পারবেন না। কখনও কখনও আপনার মেনে চলার ইন্টারফেস থাকে। এবং এটি বিশেষত সত্য যখন আপনি ভাল রক্ষণাবেক্ষণযোগ্য API গুলি ডিজাইন করেন কারণ আপনি কেবল পুরো জায়গা জুড়েই পার্শ্ব-প্রতিক্রিয়া ছুঁড়তে শুরু করতে পারবেন না। এটি এবং এটি যে জটিলতাটি প্রবর্তন করবে তা উভয়ই আপনাকে গুরুতর আকারে মারবে। সুতরাং হ্যাঁ, 99% সময়, এটি সম্পর্কে কিছুই করার কিছু নেই।
মাস্টারমাস্টিক

50

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি পরীক্ষিত ব্যতিক্রমগুলি নিয়ে কুস্তি করে কিছুটা সময় কাটিয়েছি এবং এর সাথে আমার যুক্ত করার মতো কিছু রয়েছে। এর দৈর্ঘ্যের জন্য আমাকে ক্ষমা করুন!

পরীক্ষিত ব্যতিক্রম সহ আমার প্রধান গরুর মাংস হ'ল তারা বহুবর্ষকে নষ্ট করে দেয়। পলিমারফিক ইন্টারফেসগুলির সাথে তাদের সুন্দরভাবে খেলানো অসম্ভব।

ভাল ওল 'জাভা Listইন্টারফেস নিন। আমরা সাধারণ ইন-মেমোরি বাস্তবায়নের পছন্দ আছে ArrayListএবং LinkedList। কঙ্কাল শ্রেণিও আমাদের আছেAbstractList যা নতুন ধরণের তালিকার নকশা করা সহজ করে। কেবল পঠনযোগ্য তালিকার জন্য আমাদের কেবল দুটি পদ্ধতি প্রয়োগ করতে হবে: size()এবং get(int index)

এই উদাহরণ WidgetListশ্রেণিটি ধরণের কিছু স্থির-আকারের অবজেক্টগুলি পড়েWidget কোনও ফাইল থেকে (দেখানো হয়নি) পড়ে:

class WidgetList extends AbstractList<Widget> {
    private static final int SIZE_OF_WIDGET = 100;
    private final RandomAccessFile file;

    public WidgetList(RandomAccessFile file) {
        this.file = file;
    }

    @Override
    public int size() {
        return (int)(file.length() / SIZE_OF_WIDGET);
    }

    @Override
    public Widget get(int index) {
        file.seek((long)index * SIZE_OF_WIDGET);
        byte[] data = new byte[SIZE_OF_WIDGET];
        file.read(data);
        return new Widget(data);
    }
}

পরিচিত Listইন্টারফেসটি ব্যবহার করে উইজেটগুলি প্রকাশ করে আপনি নিজের সম্পর্কে না জেনে আইটেমগুলি ( list.get(123)) পুনরুদ্ধার করতে পারেন বা একটি তালিকা পুনরুক্ত করতে পারেন । এক কোন মান পদ্ধতি জেনেরিক তালিকা ব্যবহার করার জন্য এই তালিকা পাস, অথবা একটি এটা মোড়ানো পারেন । যে কোডটি এটি ব্যবহার করে সেগুলি "উইজেটস" স্পটটিতে তৈরি হয়েছে, কোনও অ্যারে থেকে এসেছে, বা কোনও ফাইল, বা একটি ডাটাবেস থেকে, বা নেটওয়ার্ক জুড়ে বা ভবিষ্যতের সাবস্পেস রিলে থেকে পড়া বা না জানা দরকার। এটি এখনও সঠিকভাবে কাজ করবে কারণ ইন্টারফেসটি সঠিকভাবে প্রয়োগ করা হয়েছে।for (Widget w : list) ...WidgetListCollections.synchronizedListList

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

আপাতদৃষ্টিতে কেবলমাত্র একমাত্র কাজটি হ'ল কিছু চেক না করা ব্যতিক্রম হিসাবে চেক ব্যতিক্রমগুলি আবার ধরা এবং পুনরায় করা:

@Override
public int size() {
    try {
        return (int)(file.length() / SIZE_OF_WIDGET);
    } catch (IOException e) {
        throw new WidgetListException(e);
    }
}

public static class WidgetListException extends RuntimeException {
    public WidgetListException(Throwable cause) {
        super(cause);
    }
}

((সম্পাদনা: জাভা 8 একটি যুক্ত করেছে UncheckedIOException ঠিক এই ক্ষেত্রে ক্লাস : বহুবর্ষিক IOExceptionপদ্ধতির সীমানা জুড়ে গুলি ধরার এবং পুনর্বিবেচনার জন্য K আমার মতটি প্রমাণিত!))

সুতরাং চেক করা ব্যতিক্রমগুলি কেবল এ জাতীয় ক্ষেত্রে কার্যকর হয় না। আপনি তাদের নিক্ষেপ করতে পারবেন না। চতুর জন্য দিতোMapএকটি ডেটাবেস দ্বারা বা java.util.Randomসিওএম পোর্টের মাধ্যমে কোয়ান্টাম এনট্রপি উত্সের সাথে সংযুক্ত একটি প্রয়োগকরণের জন্য ডিট্টো to পলিমারফিক ইন্টারফেস প্রয়োগের সাথে আপনি যে কোনও উপন্যাস করার চেষ্টা করার সাথে সাথেই চেক করা ব্যতিক্রমগুলির ধারণাটি ব্যর্থ। তবে চেক করা ব্যতিক্রমগুলি এত कपে যে তারা এখনও আপনাকে শান্তিতে ছাড়বে না, কারণ আপনাকে এখনও নিম্ন স্তরের পদ্ধতিগুলি থেকে কোনওটিকে ধরতে হবে এবং পুনরায় পুনর্বিবেচনা করতে হবে, কোডটিকে ছড়িয়ে দেওয়া এবং স্ট্যাকের ট্রেসকে বিশৃঙ্খলা করতে হবে।

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

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

class Util {
    /**
     * Throws any {@link Throwable} without needing to declare it in the
     * method's {@code throws} clause.
     * 
     * <p>When calling, it is suggested to prepend this method by the
     * {@code throw} keyword. This tells the compiler about the control flow,
     * about reachable and unreachable code. (For example, you don't need to
     * specify a method return value when throwing an exception.) To support
     * this, this method has a return type of {@link RuntimeException},
     * although it never returns anything.
     * 
     * @param t the {@code Throwable} to throw
     * @return nothing; this method never returns normally
     * @throws Throwable that was provided to the method
     * @throws NullPointerException if {@code t} is {@code null}
     */
    public static RuntimeException sneakyThrow(Throwable t) {
        return Util.<RuntimeException>sneakyThrow1(t);
    }

    @SuppressWarnings("unchecked")
    private static <T extends Throwable> RuntimeException sneakyThrow1(
            Throwable t) throws T {
        throw (T)t;
    }
}

Hurray থেকে! এটি ব্যবহার করে আমরা স্ট্যাকের ঘোষণা না দিয়ে, এটি কোনও মোড়ানো না রেখে এবং RuntimeExceptionস্ট্যাকের ট্রেসকে বিশৃঙ্খলা ছাড়াই স্ট্যাকের উপরে গভীরতার কোনও গভীরতা ফেলে দিতে পারি ! আবার "উইজেটলিস্ট" উদাহরণ ব্যবহার করে:

@Override
public int size() {
    try {
        return (int)(file.length() / SIZE_OF_WIDGET);
    } catch (IOException e) {
        throw sneakyThrow(e);
    }
}

দুর্ভাগ্যক্রমে, চেক করা ব্যতিক্রমগুলির চূড়ান্ত অবমাননা হ'ল সংকলকটি যদি আপনার ত্রুটিযুক্ত মতামত অনুসারে এটি নিক্ষেপ করতে না পারত তবে আপনাকে একটি চেক করা ব্যতিক্রম ধরতে দেয়নি ref (যাচাই করা ব্যতিক্রমগুলির এই নিয়মটি নেই)) লুক্কায়িতভাবে ছোঁড়া ব্যতিক্রমটি ধরতে আমাদের এটি করতে হবে:

try {
    ...
} catch (Throwable t) { // catch everything
    if (t instanceof IOException) {
        // handle it
        ...
    } else {
        // didn't want to catch this one; let it go
        throw t;
    }
}

এটি কিছুটা বিশ্রী, তবে প্লাস দিকে, এটি একটি মোড়ানো ছিল এমন একটি পরীক্ষিত ব্যতিক্রম বের করার জন্য কোডের তুলনায় এখনও কিছুটা সহজ RuntimeException

সুখের বিষয়, throw t;বিবৃতিটি এখানে বৈধ, যদিও প্রকারটি tপরীক্ষা করা হয়, জাভা in-তে ধরা ব্যতিক্রম পুনর্বিবেচনা সম্পর্কে যুক্ত একটি বিধানকে ধন্যবাদ।


যখন চেক করা ব্যতিক্রমগুলি পলিমারফিজমের সাথে মিলিত হয়, বিপরীত কেসটিও একটি সমস্যা: যখন কোনও পদ্ধতিটি সম্ভাব্যভাবে একটি পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলা হিসাবে চিহ্নিত করা হয়, তবে ওভাররাইড বাস্তবায়ন হয় না। উদাহরণস্বরূপ, বিমূর্ত বর্গ OutputStream's writeপদ্ধতি সব উল্লেখ throws IOExceptionByteArrayOutputStreamএকটি সাবক্লাস যা সত্য I / O উত্সের পরিবর্তে একটি মেমোরি অ্যারেতে লিখেছে। এর ওভাররাইড হওয়া writeপদ্ধতিগুলির কারণ হতে পারে না IOException, সুতরাং তাদের কোনও throwsধারা নেই এবং আপনি ক্যাচ-বা-নির্দিষ্ট প্রয়োজনীয়তার বিষয়ে চিন্তা না করেই তাদের কল করতে পারেন।

সর্বদা বাদে ধরুন Widgetএটিকে কোনও স্ট্রিমে বাঁচানোর জন্য একটি পদ্ধতি রয়েছে:

public void writeTo(OutputStream out) throws IOException;

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

ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
    someWidget.writeTo(out);
} catch (IOException e) {
    // can't happen (although we shouldn't ignore it if it does)
    throw new RuntimeException(e);
}

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

তবে অপেক্ষা করুন, চেক করা ব্যতিক্রমগুলি আসলে এত বিরক্তিকর, তারা আপনাকে বিপরীতটি করতে দেয় না! কল্পনা করুন যে আপনি বর্তমানে কোনও কল এ IOExceptionছুঁড়ে ফেলেছেন , তবে আপনি ভেরিয়েবলের ঘোষিত প্রকারটি একটিতে পরিবর্তন করতে চানwriteOutputStreamByteArrayOutputStream একটিতে , সংকলক আপনাকে একটি চেক করা ব্যতিক্রম ধরা পড়ার চেষ্টা করার জন্য বিরক্ত করবে যা বলেছে যে এটি নিক্ষেপ করা যাবে না।

এই নিয়মের ফলে কিছু অযৌক্তিক সমস্যা দেখা দেয়। উদাহরণস্বরূপ, তিনটি writeপদ্ধতির মধ্যে একটির দ্বারা ওভাররাইড করা OutputStreamহয় নাByteArrayOutputStream । বিশেষত, write(byte[] data)একটি সুবিধা পদ্ধতি যা write(byte[] data, int offset, int length)0 এর অফসেট এবং অ্যারের দৈর্ঘ্যের সাথে কল করে পূর্ণ অ্যারেটি লিখে দেয় । ByteArrayOutputStreamত্রি-যুক্তি পদ্ধতিটি ওভাররাইড করে তবে ওয়ান-আর্গুমেন্ট সুবিধার পদ্ধতিটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়। উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিটি সঠিকভাবে কাজ করে তবে এতে একটি অবাঞ্ছিত throwsধারা অন্তর্ভুক্ত রয়েছে । এটি সম্ভবত নকশা একটি তদারকি ছিলByteArrayOutputStream , তবে তারা কখনই এটি ঠিক করতে পারে না কারণ এটি কোনও কোডের সাথে উত্সের সামঞ্জস্যতা ভেঙে দেয় যা ব্যতিক্রমকে ধরা দেয় - যে ব্যতিক্রম কখনও হয় নি, কখনও নয় এবং কখনও নিক্ষিপ্ত হবে না!

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


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

পরিবর্তে আমরা নিম্নলিখিত আইডিয়মটি পাই, যা সংকলকটি বন্ধ করার উপায় হিসাবে প্রসারিত:

try {
    ...
} catch (SomeStupidExceptionOmgWhoCares e) {
    e.printStackTrace();
}

কোনও জিইউআই বা স্বয়ংক্রিয় প্রোগ্রামে মুদ্রিত বার্তাটি দেখা যাবে না। সবচেয়ে খারাপ, ব্যতিক্রমের পরে এটি বাকী কোডটি দিয়ে লাঙল দেয়। ব্যতিক্রম কি আসলে ত্রুটি নয়? তারপরে এটি প্রিন্ট করবেন না। অন্যথায়, মুহুর্তের মধ্যে অন্য কিছু বাজতে চলেছে, যার মাধ্যমে আসল ব্যতিক্রম অবজেক্টটি চলে যাবে। এই প্রতিমাটি বেসিক On Error Resume Nextবা পিএইচপি'র চেয়ে ভাল নয় error_reporting(0);

এক ধরণের লগার ক্লাস কল করা আরও ভাল নয়:

try {
    ...
} catch (SomethingWeird e) {
    logger.log(e);
}

এটি ঠিক যেমন অলস e.printStackTrace();এবং এখনও একটি অনির্দিষ্ট অবস্থায় কোডের সাথে লাঙল। এছাড়াও, একটি নির্দিষ্ট লগিং সিস্টেম বা অন্যান্য হ্যান্ডলারের পছন্দটি অ্যাপ্লিকেশন-নির্দিষ্ট, তাই এটি পুনরায় ব্যবহারের কোডটি ব্যাথা করে।

কিন্তু অপেক্ষা করো! অ্যাপ্লিকেশন-নির্দিষ্ট হ্যান্ডলারটি খুঁজে পাওয়ার সহজ এবং সর্বজনীন উপায় রয়েছে is এটি কল স্ট্যাকের উচ্চতর (বা এটি থ্রেডের অচল ব্যতিক্রম হ্যান্ডলার হিসাবে সেট করা আছে )। সুতরাং বেশিরভাগ জায়গায়, আপনাকে কেবল ব্যতিক্রমগুলি স্ট্যাকের উপরে ফেলে দেওয়া উচিত । যেমন throw e;,। চেক করা ব্যতিক্রমগুলি কেবল পথে চলে।

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


উইজেটলিস্টের সাহায্যে আপনার আকারের পদ্ধতির জন্য, আমি আকারটি একটি ভেরিয়েবলের মধ্যে ক্যাশে করব এবং এটি কনস্ট্রাক্টরে সেট করব। কনস্ট্রাক্টর একটি ব্যতিক্রম নিক্ষেপ মুক্ত। উইজেটলিস্টটি ব্যবহার করার সময় ফাইলটি পরিবর্তন হলে এটি কাজ করবে না, এটি যদি করা হয় সম্ভবত খারাপ হবে be
তোফুবিয়ার

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

2
যথাযথ প্রতিমাটি হ'ল একটি নির্দেশনা যা নেস্টেড সাববুটিন কল দ্বারা নিক্ষিপ্ত কোনও নির্দিষ্ট ব্যতিক্রমগুলি ধরে ফেলবে এবং এটিকে মোড়ানো এগুলি পুনর্বিবেচনা করবে RuntimeException। নোট করুন যে একটি রুটিন একই সাথে ঘোষিত হতে পারে throws IOExceptionএবং তবুও নির্দিষ্ট করে যে কোনও IOExceptionনেস্টেড কল থেকে নিক্ষিপ্ত যে কোনওটিকে অপ্রত্যাশিত এবং মোড়ক হিসাবে বিবেচনা করা উচিত।
সুপারক্যাট

15
আমি এমন কিছু পেশাদার সি # বিকাশকারী যা জাভা কিছু অভিজ্ঞতার সাথে যারা এই পোস্টে হোঁচট খেয়েছে। কেউ কেন এই উদ্ভট আচরণকে সমর্থন করবে তা নিয়ে আমি অবাক হয়েছি। .NET- এ যদি আমি একটি নির্দিষ্ট ধরণের ব্যতিক্রম ধরতে চাই তবে আমি তা ধরতে পারি। আমি যদি কেবল এটি স্ট্যাকটি ছুঁড়ে দিতে চাই তবে কিছুই করার নেই। আমি আশা করি জাভা এতটা উদ্ভট ছিল না। :)
আইকেরু

"কখনও কখনও আমি অস্থায়ীভাবে একটি পদ্ধতি কলটি মন্তব্য করব" সম্পর্কিত - আমি এটির জন্য ব্যবহার করতে শিখেছি if (false)। এটি থ্রো ক্লজ সমস্যা এড়ায় এবং সতর্কতা আমাকে দ্রুত ফিরে নেভিগেট করতে সহায়তা করে। +++ যা বলেছিল, আপনি যা লিখেছেন তার সাথে আমি সম্মত। চেক করা ব্যতিক্রমগুলির কিছু মান রয়েছে তবে তাদের ব্যয়ের তুলনায় এই মানটি নগন্য। প্রায় সর্বদা তারা ঠিক পথে যায়।
মার্টিনাস

45

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

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

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

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

এ কারণেই আমি পাইথনটিতে ব্যতিক্রম হ'ল একটি বড় ফ্যান। আপনি কেবল যা চান তা এবং / বা পরিচালনা করতে পারেন catch সমস্ত কিছুই বুদবুদ হয়ে যায় যেন আপনি নিজেরাই এটি পুনর্বিবেচনা করেছেন (যা আপনি যাইহোক করেছেন)।

আমি আবার সময় এবং সময় খুঁজে পেয়েছি এবং আমি যে প্রকল্পটি উল্লেখ করেছি তার ব্যতিক্রম হ্যান্ডেলিংটি 3 টি বিভাগে পড়ে:

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

5
আপনি সরল পদ্ধতির স্বাক্ষর রেখে পৃথকীকরণের অনুমতি দিতে অ্যাপস্পেসিফিকেশন এর নির্দিষ্ট সাবক্লাসগুলি তৈরি করতে পারতেন।
থরবজর্ন রাভন অ্যান্ডারসন

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

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

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

6
@ নিউটোপিয়ান - ব্যতিক্রমগুলি মূলত কেবলমাত্র "ব্যবসায়" বা "অনুরোধ" পর্যায়ে পরিচালিত হতে পারে। প্রতিটি ক্ষুদ্র সম্ভাব্য ব্যর্থতার জন্য নয়, বৃহত্তর গ্রানুলারিটিতে ব্যর্থ হওয়া বা পুনরায় চেষ্টা করা বোধগম্য। এই কারণে, ব্যতিক্রম হ্যান্ডলিং সেরা অনুশীলনটিকে "তাড়াতাড়ি নিক্ষেপ করুন, দেরিতে ধরুন" হিসাবে সংক্ষিপ্তসার করা হয়েছে। চেক করা ব্যতিক্রমগুলি সঠিক স্তরে নির্ভরযোগ্যতা পরিচালনা করতে আরও শক্ত করে তোলে এবং বিপুল সংখ্যক মিস-কোডড ক্যাচ ব্লককে উত্সাহিত করে। litratejava.com/exception/…
থমাস ডাব্লু

24

SNR

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

জাভাতে ইউআই-থ্রেড থেকে ইউআই আপডেট করুন:

try {  
    // Run the update code on the Swing thread  
    SwingUtilities.invokeAndWait(() -> {  
        try {
            // Update UI value from the file system data  
            FileUtility f = new FileUtility();  
            uiComponent.setValue(f.readSomething());
        } catch (IOException e) {  
            throw new UncheckedIOException(e);
        }
    });
} catch (InterruptedException ex) {  
    throw new IllegalStateException("Interrupted updating UI", ex);  
} catch (InvocationTargetException ex) {
    throw new IllegalStateException("Invocation target exception updating UI", ex);
}

সি # তে ইউআই-থ্রেড থেকে ইউআই আপডেট করুন:

private void UpdateValue()  
{  
   // Ensure the update happens on the UI thread  
   if (InvokeRequired)  
   {  
       Invoke(new MethodInvoker(UpdateValue));  
   }  
   else  
   {  
       // Update UI value from the file system data  
       FileUtility f = new FileUtility();  
       uiComponent.Value = f.ReadSomething();  
   }  
}  

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

জেল বিরতি

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

@Override
public void clear()  
{  
   try  
   {  
       backingImplementation.clear();  
   }  
   catch (CheckedBackingImplException ex)  
   {  
       throw new IllegalStateException("Error clearing underlying list.", ex);  
   }  
}  

এবং এখন আপনাকে জিজ্ঞাসা করতে হবে যে সমস্ত কোডের বিন্দুটি কী? চেক করা ব্যতিক্রমগুলি কেবল শব্দের যোগ দেয়, ব্যতিক্রম ধরা পড়েছে তবে চুক্তি দ্বারা পরিচালিত হয়নি এবং নকশা করা হয়েছে (চেক করা ব্যতিক্রমগুলির ক্ষেত্রে) ভেঙে গেছে।

উপসংহার

  • ব্যতিক্রমগুলি ধরা তাদের পরিচালনা করতে আলাদা।
  • চেক করা ব্যতিক্রমগুলি কোডে শব্দ যোগ করে।
  • ব্যতিক্রম হ্যান্ডলিংগুলি তাদের ছাড়াই সি # তে ভাল কাজ করে।

আমি আগে এই সম্পর্কে ব্লগ ।


3
উদাহরণস্বরূপ জাভা এবং সি # উভয়ই ব্যতিক্রমগুলি পরিচালনা না করে কেবল তাদের প্রচার করতে দিচ্ছে (জাভা ইলিজাল স্টেটএক্সসেপশন এর মাধ্যমে)। পার্থক্যটি হ'ল আপনি একটি ফাইলনটফাউন্ডএক্সসেপশন পরিচালনা করতে চাইতে পারেন তবে ইনভোকেশনটারেজএক্সসেপশন বা ইন্টারপ্রেড এক্সসেপশন হ্যান্ডলিং কার্যকর হবে।
লুক কুইনেন

3
এবং সি # উপায়ে আমি কীভাবে জানি যে আই / ও ব্যতিক্রম ঘটতে পারে? এছাড়াও আমি কখনই রান থেকে একটি ব্যতিক্রম ছুঁড়ে ফেলব না ... আমি আপত্তিজনক ব্যতিক্রম হ্যান্ডলিং বিবেচনা করি। দুঃখিত তবে আপনার কোডটির সেই অংশটির জন্য আমি এখনও এটির পাশটি দেখতে পাচ্ছি।
তোফুবিয়ার

7
আমরা সেখানে পৌঁছে যাচ্ছি :-) তাই কোনও এপিআইয়ের প্রতিটি নতুন রিলিজের সাথে আপনাকে আপনার সমস্ত কলের মাধ্যমে চিরুনি দিতে হবে এবং ঘটতে পারে এমন কোনও নতুন ব্যতিক্রম সন্ধান করতে হবে? কোনও সংস্থা এপিআই-তে অভ্যন্তরীণভাবে সহজেই ঘটতে পারে যেহেতু তাদের পিছনের সামঞ্জস্যতা নিয়ে চিন্তা করতে হবে না।
তোফুবিয়ার

3
আপনি কি সংকেত-থেকে-শব্দ অনুপাত হ্রাস করতে চেয়েছিলেন ?
নিও 2862

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

23

আর্টিমা .NET এর অন্যতম স্থপতি আন্ডারস হেলসবার্গের সাথে একটি সাক্ষাত্কার প্রকাশ করেছিলেন, যা চেক করা ব্যতিক্রমগুলির বিরুদ্ধে তর্কগুলি তীব্রভাবে আচ্ছাদন করে। একটি ছোট টেস্টার:

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


2
আসলে, প্রধান স্থপতি।
ট্র্যাপ করুন

18
আমি এটি পড়েছি, আমার কাছে তার যুক্তিটি "সেখানে খারাপ প্রোগ্রামার রয়েছে" to
তোফুবিয়ার

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

4
@ ইয়ার, যদি আপনি চেক করা ব্যতিক্রম পছন্দ না করেন তবে একটি "নূতন রানটাইম এক্সেক্সপশন (" ফু.বার () ", ই) করার সময় আমরা এটি প্রত্যাশা করিনি" এবং এটি দিয়ে সম্পন্ন করুন)।
থরবজর্ন রাভন অ্যান্ডারসন

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

20

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

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

এবং কারণ কারণ এটি যদি তা করে তবে আমাকে এটি ঠিক করতে হবে এবং আমাকে এখনই এটি ঠিক করতে হবে। আমি তাত্ক্ষণিকভাবে জানতে চাই যে এখানে একটি সমস্যা আছে।

আপনি আসলে কতবার ব্যতিক্রমগুলি পরিচালনা করেন? আমি ব্যতিক্রম ধরার কথা বলছি না - আমি সেগুলি পরিচালনা করার বিষয়ে কথা বলছি? নিম্নলিখিতগুলি লেখা খুব সহজ:

try {
  thirdPartyMethod();
} catch(TPException e) {
  // this should never happen
}

এবং আমি জানি আপনি এটি বলতে পারেন যে এটি খারাপ অভ্যাস, এবং 'উত্তর' ব্যতিক্রমের সাথে কিছু করা (আমার অনুমান করা যাক, এটি লগ করুন?), কিন্তু রিয়েল ওয়ার্ল্ডে (টিএম) বেশিরভাগ প্রোগ্রামার কেবল এটি করেন না এটা।

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


জাভা আপনাকে এই ধরণের জিনিস করতে উত্সাহ দেয়, যাতে আপনাকে প্রতিটি পদ্ধতির স্বাক্ষরে প্রতিটি ধরণের ব্যতিক্রম যুক্ত করতে না হয়।
yfeldblum

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

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

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

1
আপনি এখানে যে ব্যাতিক্রমের কথা বলছেন তা হ'ল RuntimeExceptionsযা আপনাকে ধরতে হবে না এবং আমি সম্মত হই যে আপনার প্রোগ্রামটি চালু হওয়া উচিত। আপনার সর্বদা ধরা ও পরিচালনা করা উচিত ব্যতিক্রমগুলি হ'ল চেক করা ব্যতিক্রমগুলির মতো IOException। যদি আপনি একটি IOExceptionপান তবে আপনার কোডে ঠিক করার মতো কিছুই নেই; কেবলমাত্র একটি নেটওয়ার্ক হিচাপ ছিল বলে আপনার প্রোগ্রামটি উড়িয়ে দেওয়া উচিত নয়।
এক্সিওমেটিকনেক্সাস

20

কার্যকর জাভা ব্যতিক্রমগুলি নিবন্ধটি কখন যাচাই না করা এবং কখন চেক করা ব্যতিক্রমগুলি ব্যবহার করতে হবে তা সুন্দরভাবে ব্যাখ্যা করে। মূল বিষয়গুলি হাইলাইট করার জন্য এখানে নিবন্ধটির কয়েকটি উদ্ধৃতি দেওয়া হয়েছে:

জরুরী অবস্থা: একটি পদ্ধতির বিকল্প প্রতিক্রিয়া দাবি করে এমন একটি প্রত্যাশিত শর্ত যা পদ্ধতির উদ্দিষ্ট উদ্দেশ্য অনুসারে প্রকাশ করা যেতে পারে। পদ্ধতির কলকারী এই ধরণের শর্তগুলির প্রত্যাশা করে এবং তাদের সাথে মোকাবিলা করার কৌশল রয়েছে has

ফল্ট: একটি অপরিকল্পিত শর্ত যা পদ্ধতির অভ্যন্তরীণ বাস্তবায়নের উল্লেখ ছাড়াই বর্ণিত হতে পারে না এমন কোনও উদ্দেশ্যকে তার উদ্দেশ্য অর্জনে বাধা দেয়।

(এসও টেবিলগুলিকে অনুমতি দেয় না, তাই আপনি মূল পৃষ্ঠা থেকে নিম্নলিখিতটি পড়তে চাইতে পারেন ...)

দৈবঘটনা

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

ফল্ট

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

আমি জানি কখন তাদের ব্যবহার করবেন, আমি জানতে চাইছি যে লোকেরা কেন সেই পরামর্শ অনুসরণ করে না ... সেই পরামর্শটি অনুসরণ করে না :-)
তোফুবিয়ার

প্রোগ্রামিং বাগগুলি কী কী এবং কীভাবে সেগুলি ব্যবহারের বাগ থেকে আলাদা করতে হয় ? যদি ব্যবহারকারী প্রোগ্রামটিকে ভুল যুক্তি দিয়ে দেয় তবে এটি কোনও প্রোগ্রামিং বাগ রয়েছে? জাভা দৃষ্টিকোণ থেকে এটি কোনও প্রোগ্রামিং বাগ নাও হতে পারে তবে শেল স্ক্রিপ্টের দৃষ্টিকোন থেকে এটি একটি প্রোগ্রামিং বাগ। সুতরাং কি অবৈধ যুক্তি আছে args[]? এগুলি কি কোনও কন্টিনজেন্সি বা ফল্ট?
সিভ করা

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

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

@ মাত্তোমস্কা ত্রুটি রিটার্ন কোডগুলিকে উপেক্ষা করার প্রবণতা রয়েছে এবং এগুলি অযোগ্য হিসাবে যথেষ্ট। প্রকৃতপক্ষে, অস্বাভাবিক যে কোনও কিছু প্রায়শই কেবল স্ট্যাকের কোথাও হ্যান্ডেল করা যায় এবং এটি ব্যতিক্রমগুলির জন্য ব্যবহারের ক্ষেত্রে। আমি File#openInputStreamফিরে আসার মতো কিছু কল্পনা করতে পারি Either<InputStream, Problem>- যদি এটিই আপনি বোঝাতে চান তবে আমরা সম্মত হতে পারি।
মার্টিনাস

19

সংক্ষেপে:

ব্যতিক্রমগুলি একটি এপিআই ডিজাইনের প্রশ্ন। -- বেশিও না, কমও না.

পরীক্ষিত ব্যতিক্রমগুলির পক্ষে যুক্তি:

কেন চেক করা ব্যতিক্রমগুলি ভাল জিনিস হতে পারে না তা বোঝার জন্য আসুন প্রশ্নটি ঘুরিয়ে জিজ্ঞাসা করুন: কখন বা কেন চেক ব্যতিক্রমগুলি আকর্ষণীয় হয়, অর্থাত আপনি কেন সংকলক ব্যতিক্রমের ঘোষণা কার্যকর করতে চান?

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

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

বাস্তবে বাস্তবে, খুব বেশি সময় প্যাকেজ com.acmeকেবল AcmeExceptionনির্দিষ্ট সাবক্লাসের পরিবর্তে কেবল নিক্ষেপ করে । কলকারীদের তারপরে হ্যান্ডেল, ডিক্লেয়ার, বা পুনরায় সংকেত দেওয়া দরকার AcmeExceptions, তবে এখনও AcmeFileNotFoundErrorঘটেছে কিনা তা নিশ্চিত হওয়া যায় না AcmePermissionDeniedError

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

তাহলে কেন বিরক্ত করবেন?

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

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

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

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

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


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

1
জাভা গ্রন্থাগারের নকশা গুরুতর ভুল করেছে made 'পরীক্ষিত ব্যতিক্রমগুলি' পূর্বাভাসযোগ্য ও পুনরুদ্ধারযোগ্য आकस्मिकতার জন্য ছিল - যেমন ফাইল পাওয়া যায় নি, সংযোগ করতে ব্যর্থ। এগুলি কখনই নিম্ন-স্তরের সিস্টেমিক ব্যর্থতার জন্য উপযুক্ত বা উপযুক্ত ছিল না। চেক করার জন্য কোনও ফাইল খোলার জন্য জোর করে দেওয়া ভাল ছিল, তবে কোনও একক বাইট লেখার ব্যর্থতা / এসকিউএল কোয়েরি কার্যকর করতে ব্যর্থতার জন্য বুদ্ধিমান পুনরায় চেষ্টা বা পুনরুদ্ধার নেই is "ব্যবসায়" বা "অনুরোধে পুনরায় চেষ্টা বা পুনরুদ্ধার সঠিকভাবে পরিচালনা করা হয় "স্তর, যা যাচাই করা ব্যতিক্রমগুলি অর্থহীনভাবে কঠিন করে তোলে। litratejava.com/exception/…
টমাস ডাব্লু

17

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

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

আমি যখন কোডবেস নিয়ে কাজ করি যেখানে ব্যতিক্রমগুলি যাচাই করা হয় না, তখন ফাংশনটি কল করার সময় আমি কী আশা করতে পারি তা জানার আগে আমার কাছে কিছুটা শক্ত হয়ে যায়, যা কিছু উপাদান ভয়াবহভাবে ভাঙতে পারে।

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

সব মিলিয়ে, চেক করা ব্যতিক্রমগুলির সাথে কাজ করা আরও সহজ বলে মনে করি, বিশেষত প্রচুর বিকাশকারীদের সাথে বড় প্রকল্পগুলিতে।


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

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

13

ব্যতিক্রম বিভাগ

ব্যতিক্রম সম্পর্কে কথা বলার সময় আমি সর্বদা এরিক লিপার্টের ভেক্সিং ব্যতিক্রম ব্লগ নিবন্ধটি উল্লেখ করি। তিনি এই বিভাগগুলিতে ব্যতিক্রমগুলি রাখেন:

  • মারাত্মক - এই ব্যতিক্রমগুলি আপনার দোষ নয় : আপনি তখন আটকাতে পারবেন না এবং আপনি এগুলি সংবেদনশীলভাবে পরিচালনা করতে পারবেন না। উদাহরণস্বরূপ, OutOfMemoryErrorবা ThreadAbortException
  • বোনহেডেড - এই ব্যতিক্রমগুলি আপনার দোষ : আপনার এগুলি করা উচিত ছিল এবং তারা আপনার কোডগুলিতে বাগগুলি উপস্থাপন করে। উদাহরণস্বরূপ, ArrayIndexOutOfBoundsException, NullPointerExceptionবা কোনো IllegalArgumentException
  • ভেক্সিং - এই ব্যতিক্রমগুলি ব্যতিক্রমী নয়, আপনার দোষ নয়, আপনি এগুলি আটকাতে পারবেন না, তবে আপনাকে সেগুলি মোকাবেলা করতে হবে। এগুলি প্রায়শই একটি দুর্ভাগ্যজনক ডিজাইনের সিদ্ধান্তের ফলাফল, যেমন পার্স ব্যর্থতার কারণে কোনও বুলিয়ান মিথ্যা ফিরিয়ে দেয় এমন কোনও পদ্ধতি সরবরাহের পরিবর্তে ফেলে NumberFormatExceptionদেওয়া ।Integer.parseIntInteger.tryParseInt
  • এক্সোজেনাস - এই ব্যতিক্রমগুলি সাধারণত ব্যতিক্রমী , আপনার দোষ নয়, আপনি এগুলি (যুক্তিসঙ্গতভাবে) আটকাতে পারবেন না, তবে আপনাকে এগুলি পরিচালনা করতে হবে । উদাহরণস্বরূপ FileNotFoundException,।

একটি এপিআই ব্যবহারকারী:

  • মারাত্মক বা অস্থির মাথায় ব্যতিক্রমগুলি অবশ্যই পরিচালনা করবেন না
  • ভেক্সিং ব্যতিক্রমগুলি পরিচালনা করা উচিত তবে এগুলি কোনও আদর্শ API এ হওয়া উচিত নয়।
  • বহিরাগত ব্যতিক্রমগুলি অবশ্যই পরিচালনা করতে হবে

ব্যতিক্রম পরীক্ষা করা হয়েছে

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

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

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

এপিআই সমস্যা

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

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

উপসংহার

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

সুতরাং জাভা এবং এর চেক করা ব্যতিক্রমগুলি ঘৃণা করবেন না। পরিবর্তে, চেক হওয়া ব্যতিক্রমগুলি অতিরিক্ত ব্যবহার করে এমন API গুলি ঘৃণা করুন।


এবং শ্রেণিবিন্যাস না করে তাদের অপব্যবহার করুন।
তোফুবিয়ার

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

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

6

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

সুতরাং, কেউ চেক করা ব্যতিক্রমগুলি সরিয়ে দেয়, যেমন সি # তে করা হয়েছিল, তাহলে কীভাবে একজন প্রোগ্রামিং এবং কাঠামোগতভাবে ত্রুটির সম্ভাবনা জানাতে পারেন? ক্লায়েন্ট কোডকে কীভাবে জানানো যায় যে এই জাতীয় ত্রুটি ঘটতে পারে এবং তার মোকাবেলা করতে হবে?

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

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

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

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

যদি আমরা পরীক্ষিত ব্যতিক্রমগুলি অপসারণ করি তবে আমরা ফাংশনগুলির জন্য রিটার্নের ধরণটিও সরিয়ে দিতে পারি এবং সর্বদা একটি "যেকোন ধরণের" পরিবর্তনশীল ফিরিয়ে দিতে পারি ... যা জীবনকে এত সহজ করে তুলবে এখন তা কি না?


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

6

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

জাভাতে পরীক্ষিত ব্যতিক্রমগুলি পরবর্তী সমস্যাটি সমাধান করে না; C # এবং VB.NET স্নানের জল দিয়ে বাচ্চাকে বাইরে ফেলে দেয়।

মাঝারি রাস্তাটি নিয়ে যাওয়া একটি দুর্দান্ত পদ্ধতির বর্ণনা এই OOPSLA 2005-এর কাগজে বর্ণিত হয়েছে (বা সম্পর্কিত প্রযুক্তিগত প্রতিবেদন ))

সংক্ষেপে, এটি আপনাকে বলতে দেয়: method g(x) throws like f(x)যার অর্থ হ'ল সমস্ত ব্যতিক্রম ছুঁড়ে ফেলেছে f ভয়েলা, ক্যাসকেডিং পরিবর্তনের সমস্যা ছাড়াই ব্যতিক্রমগুলি পরীক্ষা করা হয়েছে।

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


5

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

ক্লাস Exceptionএক কল্পনা করে? ঠিক আছে না, কারণ Exceptions ব্যতিক্রম এবং একইভাবে ব্যতিক্রমগুলি s এর ব্যাতিক্রম Exceptionব্যতীত s নয় Exception , কারণ অন্যান্য ব্যতিক্রমগুলি আসলে Errors, যা অন্য ধরণের ব্যতিক্রম, এক প্রকার অতিরিক্ত ব্যতিক্রমী ব্যতিক্রম যা কখনও ঘটবে না except কখন এটি করা হয় এবং যা কখনও কখনও আপনার করা ছাড়া আর কখনও ধরা উচিত নয়। ছাড়া যে সব কারণ আপনি অন্যান্য ব্যতিক্রম যে তন্ন তন্ন হয় বর্ণনা করতে পারেন না Exceptionগুলি কিংবা Errorগুলি নিছক কিন্তু Throwableব্যতিক্রম।

এর মধ্যে কোনটি "পরীক্ষিত" ব্যতিক্রম? Throwableগুলি ব্যতীত চেক করা হয়, যদি সেগুলি ও হয় তবে যাচাই করা ব্যাতিক্রম হয় Errorএবং তারপরে এসগুলিও রয়েছে এবং এটিরও ব্যতিক্রম ব্যতীত Exceptionযেগুলি রয়েছে এবং Throwableযাচাই করা ব্যতিক্রমের প্রধান ধরণ, যা তারা যদি এছাড়াও RuntimeExceptionএস, কারণ এটি অন্য ধরণের চেক করা ব্যতিক্রম।

কীসের RuntimeExceptionজন্য? নামটি যেমন বোঝায় ঠিক তেমন, তারাও ব্যাতিক্রম, সকলের মতো Exception, এবং রান-টাইমে ঘটে যায়, সমস্ত ব্যতিক্রমের মতো, RuntimeExceptionঅন্যান্য রান-টাইমের তুলনায় ব্যতিক্রমী Exceptionকারণ এগুলি বাদে ঘটবে বলে মনে করা হয় না যখন আপনি কিছু নির্বোধ ত্রুটি করেন, যদিও RuntimeExceptionসেগুলি কখনই হয় না Error, সুতরাং এটি এমন জিনিসগুলির জন্য যা ব্যতিক্রমী ভ্রান্ত কিন্তু বাস্তবে তা নয় Error। ছাড়া RuntimeErrorException, যা সত্যিই একটি হয় RuntimeExceptionজন্য Errorগুলি। তবে কি সমস্ত ব্যতিক্রমগুলি অন্যায় পরিস্থিতিতে উপস্থাপন করার কথা নয়? হ্যাঁ, সব। ব্যতীত ThreadDeath, একটি ব্যতিক্রমীভাবে অবাস্তব ব্যতিক্রম, যেমন ডকুমেন্টেশন ব্যাখ্যা করে যে এটি একটি "সাধারণ ঘটনা" এবং এটিError

যাইহোক, যেহেতু আমরা সমস্ত ব্যতিক্রমগুলি মাঝখানে নীচে Errorগুলি (যা ব্যতিক্রমী কার্যকর কার্যকরকরণ ব্যতিক্রম, তাই চেক করা হয় না) এবং Exceptionএর মধ্যে (যা কম ব্যতিক্রমী কার্যকর কার্যকরকরণের ত্রুটিগুলির জন্য, সুতরাং যখন না হয় তবে তা পরীক্ষা করে নেওয়া হয়), এখন আমাদের দুটি দরকার বিভিন্ন ব্যতিক্রম বিভিন্ন প্রতিটি। তাই আমরা প্রয়োজন IllegalAccessErrorএবং IllegalAccessException, এবং InstantiationErrorএবং InstantiationExceptionএবং NoSuchFieldErrorএবং NoSuchFieldExceptionএবং NoSuchMethodErrorএবং NoSuchMethodExceptionএবং ZipErrorএবং ZipException

এটি ব্যতীত যখন কোনও ব্যতিক্রম চেক করা হয় তখনও সবসময় (মোটামুটি সহজ) উপায়গুলি কম্পাইলারকে প্রতারণা করে এবং এটি পরীক্ষা না করে ফেলে দেওয়া যায়। যদি আপনি এমনটি করেন যে আপনি UndeclaredThrowableExceptionঅন্যান্য ক্ষেত্রে ব্যতীত এটি পেতে পারেন , যেখানে এটি একটি UnexpectedExceptionবা একটি হিসাবে যুক্ত হতে পারে UnknownException(যা সম্পর্কিত নয় UnknownErrorযা কেবল "গুরুতর ব্যতিক্রমগুলির জন্য"), বা একটি ExecutionException, বা একটি InvocationTargetException, বা একটি ExceptionInInitializerError

ওহ, এবং আমরা জাভা 8 এর স্নাজি নতুনকে ভুলে যাব না UncheckedIOException, যা আই / ও ত্রুটির কারণে সৃষ্ট RuntimeExceptionচেক করা IOExceptionব্যতিক্রমগুলি মোড়ক দিয়ে আপনাকে উইন্ডোটির বাইরে ব্যতিক্রম চেকিং ধারণাটি ফেলে দিতে দেয় এমন এক ব্যতিক্রম (যা IOErrorব্যতিক্রম ঘটায় না , যদিও এটি বিদ্যমান খুব সহজেই পরিচালনা করা খুব কঠিন এবং তাই আপনার চেক করা উচিত নয়।

ধন্যবাদ জাভা!


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

5

সমস্যাটি

ব্যতিক্রম হ্যান্ডলিং প্রক্রিয়াটির সাথে আমি যে সবচেয়ে খারাপ সমস্যাটি দেখতে পাচ্ছি তা হ'ল এটি বড় আকারে কোড ডুপ্লিকেশন প্রবর্তন করে ! আসুন সত্য হয়ে উঠুন: 95% এর বেশিরভাগ প্রকল্পে বিকাশকারীদের ব্যতিক্রমের সাথে সত্যিই যা করা দরকার তা হ'ল এটি কোনওভাবে ব্যবহারকারীর সাথে যোগাযোগ করা (এবং, কিছু ক্ষেত্রে, উন্নয়ন দলের সাথেও যেমন, কোনও ইমেল পাঠিয়ে স্ট্যাক ট্রেস সহ মেইল)। সুতরাং সাধারণত একই লাইন / কোডের ব্লক কোডগুলি প্রতি স্থানে ব্যতিক্রমগুলি পরিচালনা করা হয়।

আসুন ধরে নেওয়া যাক আমরা কিছু ধরণের পরীক্ষিত ব্যতিক্রমের জন্য প্রতিটি ক্যাপ ব্লকে সাধারণ লগিং করি:

try{
   methodDeclaringCheckedException();
}catch(CheckedException e){
   logger.error(e);
}

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

এক মুহুর্ত অপেক্ষা করুন ... আমরা কি কোডের সেই কয়েকশত অবস্থানের সমস্তই সম্পাদনা করতে যাচ্ছি ?! আপনি আমার বক্তব্য পেতে :-)।

সমাধান

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

try{
    methodDeclaringCheckedException();
}catch(CheckedException e){
    exceptionHandler.handleError(e);
}

এখন আমাদের ব্যতিক্রম হ্যান্ডলিংটি কাস্টমাইজ করতে আমাদের কেবলমাত্র একক জায়গায় কোড পরিবর্তন করতে হবে (EH কোড)।

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

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

শেষ এক জিনিস

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


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

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

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

4
সঠিক, @ পিয়োটারসোবজাইক। বেশিরভাগ ক্ষেত্রে, ব্যতিক্রমের প্রতিক্রিয়া হিসাবে গ্রহণ করার জন্য একমাত্র সঠিক পদক্ষেপ হ'ল লেনদেনকে রোলব্যাক করা এবং ত্রুটির প্রতিক্রিয়া ফিরিয়ে দেওয়া। "সমাধান ব্যতিক্রম" এর ধারণাগুলি জ্ঞান ও কর্তৃত্বকে বোঝায় যে আমাদের নেই (এবং থাকা উচিত নয়) এবং এনক্যাপসুলেশন লঙ্ঘন করে। আমাদের অ্যাপ্লিকেশন যদি ডিবি না হয় তবে আমাদের ডিবি ঠিক করার চেষ্টা করা উচিত নয় । পরিষ্কারভাবে ব্যর্থ হওয়া এবং ভ্রান্ত ডেটা, সিভিং রচনা এড়ানো এড়ানো যথেষ্ট দরকারী
টমাস ডাব্লু

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

4

অ্যান্ডারস চেক করা ব্যতিক্রমগুলির ক্ষতি এবং সফটওয়্যার ইঞ্জিনিয়ারিং রেডিওর episode৯ পর্বের কেন তাকে সি # থেকে ছাড়লেন তা সম্পর্কে কথা বলেছেন ।


4

C2.com এ আমার লিখনআপ এখনও মূল আকার থেকে এখনও বেশিরভাগই অপরিবর্তিত: চেকডঅ্যাক্সপশনসআরআইকনপোটিভ উইথভিসিটার প্যাটার্ন

সংক্ষেপে:

ভিজিটর প্যাটার্ন এবং এর আত্মীয়স্বজনগুলি ইন্টারফেসের একটি শ্রেণি যেখানে অপ্রত্যক্ষ কলার এবং ইন্টারফেস বাস্তবায়ন উভয়ই একটি ব্যতিক্রম সম্পর্কে জানেন তবে ইন্টারফেস এবং ডাইরেক্ট কলার এমন একটি লাইব্রেরি গঠন করেন যা জানেন না।

চেকডেক্সেপশনগুলির মৌলিক অনুমান সমস্ত ঘোষিত ব্যতিক্রম যে কোনও বিন্দু থেকে ফেলে দেওয়া যেতে পারে যা সেই ঘোষণার সাথে কোনও পদ্ধতিকে ডাকে calls ভিজিটরপ্যাটার্নটি এই অনুমানটিকে ত্রুটিযুক্ত বলে প্রকাশ করে।

এর মতো ক্ষেত্রে চেক করা ব্যতিক্রমগুলির চূড়ান্ত ফলাফলটি হ'ল প্রচুর অন্যথায় অকেজো কোড যা রানটাইমগুলিতে মূলত কম্পাইলারের পরীক্ষিত ব্যতিক্রম সীমাবদ্ধতা দূর করে।

অন্তর্নিহিত সমস্যা হিসাবে:

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


1
ইন্টারফেসে আপনার DAGNodeException এর মতো কিছু হওয়া উচিত, তারপরে IOException ধরুন এবং এটিকে DAGNodeException এ রূপান্তর করুন: সর্বজনীন শূন্য কল (DAGNode আরগ) DAGNodeException ছোঁড়ে;
তোফুবিয়ার

2
@ তোফুবিয়ার, এটাই আমার বক্তব্য। আমি দেখতে পেয়েছি যে ক্রমাগত মোড়ানো এবং মোড়ক ব্যতিক্রমগুলি চেক করা ব্যতিক্রমগুলি অপসারণের চেয়ে খারাপ।
জোশুয়া

2
ঠিক আছে তবে আমরা সম্পূর্ণই একমত নই ... তবে আপনার নিবন্ধটি যখন রানটাইম ব্যতিক্রম ছড়িয়ে দেওয়া হয় তখন আপনি কীভাবে আপনার অ্যাপ্লিকেশনটিকে স্ট্যাক ট্রেস প্রদর্শন বন্ধ করে দেওয়া বন্ধ করেন তার প্রকৃত অন্তর্নিহিত প্রশ্নের উত্তর দেয় না।
তোফুবিয়ার

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

4

কেবল উত্তর না দেওয়া প্রশ্নের সমাধানের চেষ্টা করার জন্য:

আপনি যদি ব্যতিক্রম সাবক্লাসের পরিবর্তে রানটাইমএক্সেপশন সাবক্ল্যাসগুলি ফেলে দেন তবে আপনি কীভাবে ধরবেন বলে আপনি জানেন?

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

উদাহরণ স্বরূপ:

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

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


2
যথাযথভাবে। সহজ এবং সোজা, ব্যতিক্রম হ্যান্ডলিংয়ের উপায়। ডেভ যেমন বলেছেন, সঠিক ব্যতিক্রম-হ্যান্ডলিং সাধারণত একটি উচ্চ স্তরে করা হয় । "তাড়াতাড়ি নিক্ষেপ করুন, দেরি ধরুন" নীতিটি হ'ল চেক করা ব্যতিক্রমগুলি এটি কঠিন করে তোলে।
থমাস ডাব্লু

4

এই নিবন্ধটি আমি যা পড়েছি জাভাতে ব্যতিক্রম হ্যান্ডলিংয়ের পাঠ্যের সেরা টুকরো।

এটি চেক করা ব্যাতিক্রমগুলি ছাড়াই চেক করা পছন্দ করে তবে এই পছন্দটি খুব জোড়ভাবে এবং দৃ strong় যুক্তির ভিত্তিতে ব্যাখ্যা করা হয়েছে।

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

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

লেখক "প্রতিক্রিয়া":

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

এবং প্রধান চিন্তা বা নিবন্ধটি হ'ল:

সফ্টওয়্যারটিতে হ্যান্ডলিংয়ের ক্ষেত্রে যখন ত্রুটি আসে তখন কেবলমাত্র নিরাপদ এবং সঠিক অনুমানটিই করা যেতে পারে যে উপস্থিত প্রতিটি সাব্রোটিন বা মডিউলটিতে একেবারে ব্যর্থতা দেখা দিতে পারে!

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

এত দুঃখজনক নয় যে অনেক পোপল এই দুর্দান্ত নিবন্ধটি আবিষ্কার করেছে :-( আমি পুরোপুরি সবাইকে পরামর্শ দিচ্ছি যে যারা কোন পদ্ধতির দ্বিধা প্রকাশ করে কিছুটা সময় নেওয়া এবং এটি পড়া ভাল।


4

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

মূল ধারণার মধ্যে যা কখনও অন্তর্ভুক্ত ছিল না তা হ'ল বিস্তৃত পদ্ধতিগত এবং অপ্রাপ্তযোগ্য ব্যর্থতা ঘোষণার জন্য বাধ্য করা। এই ব্যর্থতা চেক ব্যতিক্রম হিসাবে ঘোষণা করা কখনও সঠিক ছিল না।

ব্যর্থতা সাধারণত কোডে সম্ভব হয় এবং ইজেবি, ওয়েব এবং সুইং / এডাব্লুটি কনটেইনারগুলি ইতিমধ্যে একটি বহিরাগত "ব্যর্থ অনুরোধ" ব্যতিক্রম হ্যান্ডলার সরবরাহ করে এটি সরবরাহ করে। সর্বাধিক প্রাথমিক সঠিক কৌশল হ'ল লেনদেনটি রোলব্যাক করা এবং ত্রুটি ফিরে পাওয়া।

একটি গুরুত্বপূর্ণ বিষয়, রানটাইম এবং চেক করা ব্যতিক্রমগুলি কার্যত সমতুল্য। কোনও পরিচালনা বা পুনরুদ্ধার নেই যা যাচাই করা ব্যতিক্রমগুলি করতে পারে, যা রানটাইম ব্যতিক্রমগুলি পারে না।

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

যদি আমাদের অ্যাপ্লিকেশনটি ডিবি না হয় .. আমাদের চেষ্টা করা উচিত এবং ডিবি ঠিক করা উচিত নয়। এটি এনক্যাপসুলেশন নীতি লঙ্ঘন করবে ।

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

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

জাভাতে আমাদের কয়েক হাজার চেষ্টা-করার চেষ্টা করে না এমন উল্লেখযোগ্য অনুপাত (৪০% +) মিসকোড করা সহ হাজারে করণীয়-চেষ্টা-করার ব্লক প্রয়োজন an এর প্রায় কোনওটিই আসল হ্যান্ডলিং বা নির্ভরযোগ্যতা বাস্তবায়ন করে না, তবে বড় কোডিং ওভারহেড চাপিয়ে দেয়।

শেষ পর্যন্ত, "পরীক্ষিত ব্যতিক্রমগুলি" এফপি ফাংশনাল প্রোগ্রামিংয়ের সাথে বেশ বেমানান।

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

অনেকে চেক করা ব্যতিক্রমগুলি "পরিচালনা" সম্পর্কে কথা বলেন তবে তাদের টুপি দিয়ে কথা বলছেন। সফলতার ভান করতে নাল, অসম্পূর্ণ বা ভুল ডেটা দিয়ে ব্যর্থতার পরে অবিরত থাকা কোনও কিছুই পরিচালনা করছে না। এটি ইঞ্জিনিয়ারিং / সর্বনিম্ন ফর্মটির নির্ভরযোগ্যতা সংক্রান্ত খারাপ ractice

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

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

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

দেখুন:
- http://literatejava.com/exception/checked-exception-javas-biggest-mistake/


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

1
আমার উত্তর ইতিমধ্যে উপরে এটি ঠিকানা। প্রথম এবং সর্বাগ্রে, 1) বহিরাগত ব্যর্থতা হ্যান্ডলারের সমস্ত কিছু ধরা উচিত। এর বাইরে, কেবল নির্দিষ্ট চিহ্নিত সাইটগুলির জন্য, ২) নির্দিষ্ট প্রত্যাশিত आकस्मिक পরিস্থিতি ধরা পড়ে এবং পরিচালনা করা যায় - তত্ক্ষণাত্ তারা নিক্ষেপ করা হয় site এর অর্থ ফাইল পাওয়া যায় নি, অপর্যাপ্ত তহবিল ইত্যাদি এগুলি পুনরুদ্ধার করা যেতে পারে - এর চেয়ে বেশি নয় no এনক্যাপসুলেশনের মূলনীতিটির অর্থ হ'ল বাইরের স্তরগুলি গভীর ভিতরে ভিতরে ব্যর্থতাগুলি বুঝতে / পুনরুদ্ধারের জন্য দায়বদ্ধ হতে পারে না। তৃতীয়, 3) বাকি সমস্ত কিছুই বাইরে দিকে ছুঁড়ে ফেলা উচিত - যদি সম্ভব হয় তবে তা পরীক্ষা না করা।
থমাস ডাব্লু

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

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

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

4

লোকেরা ইতিমধ্যে জানিয়েছে যে, জাভা বাইটকোডে চেক করা ব্যতিক্রমগুলি বিদ্যমান নেই। এগুলি কেবল একটি সংকলক প্রক্রিয়া, অন্যান্য সিনট্যাক্স চেকের বিপরীতে নয়। আমি ব্যতিক্রম অনেক পরীক্ষিত দেখুন আমি কম্পাইলার সম্পর্কে একটি অপ্রয়োজনীয় শর্তসাপেক্ষ অভিযোগ দেখুন: if(true) { a; } b;। এটি সহায়ক তবে আমি এটি উদ্দেশ্য করে করতে পারি, সুতরাং আমাকে আপনার সতর্কতাগুলি উপেক্ষা করতে দিন।

বিষয়টির সত্যতা হ'ল, আপনি যদি চেক ব্যাতিক্রমগুলি প্রয়োগ করেন তবে আপনি প্রতিটি প্রোগ্রামারকে "সঠিক কাজটি করতে" বাধ্য করতে সক্ষম হবেন না এবং বাকি সবাই এখন সমান্তরাল ক্ষতির কারণ যিনি আপনার তৈরি নিয়মের জন্য কেবল আপনাকে ঘৃণা করে।

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


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

3

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

পরীক্ষিত ব্যতিক্রমগুলির সাথে আর একটি সমস্যা হ'ল এগুলি অপব্যবহারের প্রবণতা। এই নিখুঁত উদাহরণ রয়েছে java.sql.Connectionএর close()পদ্ধতি। এটি একটি নিক্ষেপ করতে SQLExceptionপারে, যদিও আপনি ইতিমধ্যে স্পষ্টভাবে বলেছেন যে আপনি সংযোগটি সম্পন্ন করেছেন। কোন তথ্য সম্ভবত () সম্ভবত আপনাকে জানাতে চাইবে এমনটি জানাতে পারে?

সাধারণত, আমি যখন কোনও সংযোগটি বন্ধ করি তখন *এটিকে এমন কিছু দেখাচ্ছে:

try {
    conn.close();
} catch (SQLException ex) {
    // Do nothing
}

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

*অতিরিক্ত মন্তব্য হিসাবে, একটি পুলড কানেকশনের সংযোগ.কোলোস () এমনকি কোনও সংযোগ বন্ধ করে না , তবে এটি এখনও একটি চেক ব্যতিক্রম হওয়ার কারণে আপনাকে এসকিউএলএক্সেপশন ধরতে হবে।


2
ঠিক আছে, ড্রাইভারগুলির যে কেউ পারেন ... প্রশ্নটি বরং "প্রোগ্রামারকে কেন দেখাশোনা করা উচিত?" যেভাবে সে ডেটাবেস অ্যাক্সেস সম্পন্ন করেছে। দস্তাবেজগুলি আপনাকে সতর্কও করে যে আপনার কাছে সর্বদা () বা রোলব্যাক () কল করার আগে () কল করার আগে বর্তমান লেনদেন করা উচিত।
পাওয়ারলর্ড

অনেক লোক মনে করেন যে কোনও ফাইলের কাছাকাছি হওয়া ব্যতিক্রম করতে পারে না ... স্ট্যাকওভারফ্লো . com/ প্রশ্নস / ৫৮85464646/২ আপনি কি 100% নিশ্চিত যে বিষয়টি বিবেচনা করার মতো কোনও ঘটনা নেই?
তোফুবিয়ার

আমি 100% নিশ্চিত কোন ক্ষেত্রে এটি আছে আছি হবে কোন ব্যাপার এবং আহ্বানকারী যে করবে না ব্যবহার করে দেখুন / ধরা রাখা।
মার্টিন

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

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

3

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

পাতলা সুবিধা ভারসাম্যপূর্ণ ব্যয় দ্বারা ছাপিয়ে গেছে (বিশেষত বৃহত্তর, কম নমনীয় কোড বেসগুলিতে যেখানে ইন্টারফেসের স্বাক্ষরগুলিতে ক্রমাগত পরিবর্তন করা কার্যকরী নয়)।

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


2

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

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

আরও একটি জিনিস - এ RuntimeExceptionসবসময় হয় না "যেখানে কোনও বিকাশকারী কিছু ভুল করে"। আপনি চেষ্টা করে একটি enumব্যবহার তৈরি করার সময় একটি অবৈধ যুক্তিযুক্ত ব্যতিক্রম নিক্ষেপ করা হয় valueOfএবং enumসেই নামটি নেই। এটি বিকাশকারী দ্বারা অগত্যা কোনও ভুল নয়!


1
হ্যাঁ, এটি বিকাশকারী দ্বারা ভুল mistake তারা পরিষ্কারভাবে সঠিক নামটি ব্যবহার করেনি, তাই তাদের ফিরে যেতে হবে এবং তাদের কোডটি ঠিক করতে হবে।
অ্যাক্সিওম্যাটিকনেক্সাস

@ অক্সিমেটিকনেক্সাস কোনও বুদ্ধিমান বিকাশকারী enumসদস্যের নাম ব্যবহার enumকরে না , কেবল কারণ তারা পরিবর্তে অবজেক্ট ব্যবহার করে। সুতরাং কোনও ভুল নাম কেবল বাইরে থেকে আসতে পারে, তা আমদানি ফাইল বা যাই হোক না কেন। এই জাতীয় নামগুলি ব্যবহার করার একটি সম্ভাব্য উপায় হ'ল MyEnum#valueOfআইএই কল করা এবং ধরা catch আরেকটি উপায় হ'ল প্রাক-ভরাট ব্যবহার করা Map<String, MyEnum>, তবে এগুলি বাস্তবায়নের বিশদ।
মার্টিনাস

@ maaartinus এমন কেস রয়েছে যেখানে এনাম সদস্যদের নাম বাইরে থেকে আসা স্ট্রিং ছাড়াই ব্যবহার করা হয়। উদাহরণস্বরূপ, আপনি যখন প্রতিটি সদস্যকে কিছু দিয়ে কিছু করার জন্য গতিশীলভাবে লুপ করতে চান। তদুপরি, স্ট্রিংটি বাইরে থেকে আসে কিনা তা অপ্রাসঙ্গিক। এক্স স্ট্রিংটি "MyEnum # valueOf" এ পাস করার আগে এটি পাস করার আগে একটি ত্রুটি ঘটবে কিনা তা জানতে বিকাশকের কাছে তাদের প্রয়োজনীয় সমস্ত তথ্য রয়েছে। এক্স স্ট্রিংটিকে "MyEnum # valueOf" তে যাইহোক যখন এটি ত্রুটির কারণ হতে পারে তখন এটি বিকাশকারীদের পক্ষ থেকে ভুল হতে পারে clearly
অক্সিমেটিকনেক্সাস

2

চেক করা ব্যতিক্রমগুলির বিরুদ্ধে এখানে একটি যুক্তি রয়েছে (joelonsoftware.com থেকে):

যুক্তিটি হ'ল আমি ব্যতিক্রমগুলি "গোটো" এর চেয়ে ভাল বলে বিবেচনা করি, যা ১৯s০ এর দশক থেকে ক্ষতিকারক হিসাবে বিবেচিত হয়, এতে তারা কোডের একটি বিন্দু থেকে অন্য বিন্দুতে আকস্মিক লাফ তৈরি করে। আসলে তারা গোটোর চেয়ে উল্লেখযোগ্যভাবে খারাপ:

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

3
+1 আপনি নিজের উত্তরে তর্কটি সংক্ষেপ করতে চাইবেন যদিও? এগুলি আপনার রুটিনগুলির জন্য অদৃশ্য গোটোস এবং প্রারম্ভিক প্রস্থানগুলির মতো, যা পুরো প্রোগ্রাম জুড়ে ছড়িয়ে পড়ে।
মার্কজে

13
এটি সাধারণভাবে ব্যতিক্রমগুলির বিরুদ্ধে আরও যুক্তি।
আয়নু জি স্টান 9

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

2
@ ইভা তারা এক নয়। একটি গোটো বিবৃতি দিয়ে আপনি gotoকীওয়ার্ডটি দেখতে পাবেন । একটি লুপ আপনি ক্লোজিং বক্রবন্ধনী বা দেখতে পারেন breakবা continueশব্দ। তাদের সবাই বর্তমান পদ্ধতিতে একটি বিন্দুতে লাফিয়ে। তবে আপনি সর্বদা দেখতে পারবেন না throw, কারণ এটি প্রায়শই বর্তমান পদ্ধতিতে নয় তবে অন্য পদ্ধতিতে যা এটি কল করে (সম্ভবত পরোক্ষভাবে))
ফিনউইউ

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

2

ভাল প্রমাণিত যে চেক করা ব্যাতিক্রম প্রয়োজন হয় না:

  1. জাভা জন্য কিছু কাজ করে যে কাঠামো অনেক। বসন্তের মতো যা জেডিবিসি ব্যতিক্রমকে চেক করা ব্যতিক্রমগুলিতে আবৃত করে, লগতে বার্তা নিক্ষেপ করে
  2. জাভা পরে অনেকগুলি ভাষা এসেছিল, এমনকি জাভা প্ল্যাটফর্মের উপরেও - তারা সেগুলি ব্যবহার করে না
  3. ব্যতিক্রম চেক করা হয়েছে, ক্লায়েন্ট কীভাবে একটি ব্যতিক্রম ছুঁড়ে এমন কোড ব্যবহার করবে তা সম্পর্কে সদয় ভবিষ্যদ্বাণী। তবে কোনও বিকাশকারী যিনি এই কোডটি লেখেন সে কোড এবং ক্লায়েন্ট যে সিস্টেমে কাজ করছে সে সম্পর্কে কখনই জানতে পারবে না Inter সিস্টেমে 100 টি বাস্তবায়ন রয়েছে, 50 বা 90 টি বাস্তবায়নও এই ব্যতিক্রমটিকে ছুঁড়ে না ফেলে তবে ক্লায়েন্টকে এখনও অবশ্যই এই ব্যতিক্রমটি ধরতে হবে যদি তিনি সেই ইন্টারফেসের ব্যবহারকারী উল্লেখ করেন। এই 50 বা 90 টি বাস্তবায়ন লগকে ব্যতিক্রম করে তাদের ভিতরে এই ব্যতিক্রমগুলি পরিচালনা করে (এবং এটি তাদের পক্ষে ভাল আচরণ)। তার সাথে আমাদের কী করা উচিত? আমার আরও কিছু ব্যাকগ্রাউন্ড যুক্তি থাকতে হবে যা সেই সমস্ত কাজটি করতে পারে - লগতে বার্তা প্রেরণ। এবং যদি আমি কোডের ক্লায়েন্ট হিসাবে অনুভব করি তবে আমার ব্যতিক্রম হ্যান্ডেল করা দরকার - আমি এটি করব।
  4. আর একটি উদাহরণ যখন আমি জাভাতে I / O এর সাথে কাজ করছি তখন ফাইলটি উপস্থিত না থাকলে এটি আমাকে সমস্ত ব্যতিক্রমগুলি পরীক্ষা করতে বাধ্য করে? এর সাথে আমার কী করা উচিত? এটি উপস্থিত না থাকলে, সিস্টেমটি পরবর্তী পদক্ষেপে যাবে না। এই পদ্ধতির ক্লায়েন্ট, সেই ফাইল থেকে প্রত্যাশিত সামগ্রী পাবেন না - তিনি রানটাইম ব্যতিক্রম পরিচালনা করতে পারবেন, অন্যথায় আমার প্রথমে চেক করা ব্যতিক্রমটি পরীক্ষা করা উচিত, লগ ইন করার জন্য একটি বার্তা দেওয়া উচিত, তারপরে পদ্ধতিটি থেকে ব্যতিক্রম ছুঁড়ে ফেলা উচিত। না ... না - রানটাইমসেপশন সহ আমি স্বয়ংক্রিয়ভাবে এটি করব, এটি স্বয়ংক্রিয়ভাবে চলে / চলে যায়। এটি ম্যানুয়ালি হ্যান্ডেল করার কোনও ধারণা নেই - আমি খুশী হব আমি লগটিতে একটি ত্রুটি বার্তা দেখেছি (এওপি এটির সাথে সহায়তা করতে পারে .. যা জাভা স্থির করে)) যদি, শেষ পর্যন্ত, আমি শেষ করছি যে সিস্টেমটি শেষ ব্যবহারকারীকে পপ-আপ বার্তা প্রদর্শন করবে - আমি এটি দেখাব, কোনও সমস্যা নয়।

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


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

2

একটি গুরুত্বপূর্ণ বিষয় যার যার উল্লেখ নেই তা হ'ল এটি কীভাবে ইন্টারফেস এবং ল্যাম্বদা এক্সপ্রেশনগুলিতে হস্তক্ষেপ করে।

যাক আপনি একটি সংজ্ঞায়িত করুন MyAppException extends Exception। এটি আপনার অ্যাপ্লিকেশন দ্বারা ছড়িয়ে দেওয়া সমস্ত ব্যতিক্রম দ্বারা উত্তরাধিকার সূত্রে প্রাপ্ত শীর্ষ স্তরের ব্যতিক্রম। প্রতিটি পদ্ধতি ঘোষণা করে throws MyAppExceptionযেটি কিছুটা উপদ্রব, তবে পরিচালনাযোগ্য। একটি ব্যতিক্রম হ্যান্ডলার ব্যতিক্রম লগ করে এবং কোনওভাবে ব্যবহারকারীকে অবহিত করে।

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

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


1

আমরা সি # এর প্রধান স্থপতি সম্পর্কে কিছু উল্লেখ দেখেছি।

চেক করা ব্যতিক্রম কখন ব্যবহার করতে হবে সে সম্পর্কে জাভা লোকের কাছ থেকে দেখার বিকল্প বিকল্প এখানে। তিনি উল্লেখ করেছেন যে অনেক নেতিবাচক তিনি স্বীকার করেছেন: কার্যকর ব্যতিক্রম


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

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

0

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

এমনকি যদি তাদের মধ্যে একটি লাইন আঁকতে এত সহজ না হয় তবে আমি দেখতে পেয়েছি যে একই সময়ে ছাদে বেশ কয়েকটি চেক ব্যতিক্রমগুলি মোড়ানো ব্যতীত বেশ কয়েকটি এপিআই / লাইব্রেরি একত্রীকরণ করা সত্যিই বিরক্তিকর / মুশকিল is কিছু ব্যতিক্রম ধরা পড়তে বাধ্য করা এবং বর্তমানের প্রেক্ষাপটে আরও বেশি অর্থবোধ তৈরি করে এমন একটি আলাদা সরবরাহ করতে বাধ্য / কার্যকর better

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

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

সর্বজনীন শূন্য রান () {

try {
     ... do something ...
} catch (Throwable throwable) {
     ApplicationContext.getExceptionService().handleException("Handle this exception", throwable);
}

}

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

অবশ্যই এটি আমার মতামত, এবং এটি সঠিক মত নাও হতে পারে তবে এটি আমার কাছে ভাল পদ্ধতির মত দেখাচ্ছে। আমি প্রকল্পটি প্রকাশের পরে দেখতে পাব যদি আমার মনে হয় যা এটি আমার পক্ষে ভাল তবে এটি অন্যের পক্ষেও ভাল ... :)

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