java - চেক আপ ব্যতিক্রম বিরুদ্ধে মামলা




exception checked-exceptions (20)

SNR

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

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

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);
}

সি UI- থ্রেড থেকে UI আপডেট করুন #

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();  
   }  
}  

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

জেল ব্রেক

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

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

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

উপসংহার

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

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

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

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

প্রতিটি কথোপকথন আমি একই প্রশ্নের সাথে শেষ করেছি উত্তরহীন অনুগ্রহ করে ... আমাকে সেট আপ করতে দাও:

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

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

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

আরেকটি সাধারণ যুক্তি আমি শুনেছি যে চেক ব্যতিক্রমগুলি কোডকে পুনরায় প্রতিক্রিয়া করা কঠিন করে তোলে।

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

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

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

যে প্রশ্নটি মানুষ কখনো উত্তর দেয় না তা হল:

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

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

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

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

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

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

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


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

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

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

একটি API ব্যবহারকারী:

  • মারাত্মক বা অস্থির হ্যান্ডেল হ্যান্ডেল করা উচিত নয়
  • vexing ব্যতিক্রম হ্যান্ডেল করা উচিত , কিন্তু তারা একটি আদর্শ API এ ঘটতে হবে না।
  • exogenous ব্যতিক্রম হ্যান্ডেল করতে হবে

চেক আপ ব্যতিক্রম

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

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

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

API সমস্যা

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

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

উপসংহার

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

সুতরাং জাভা এবং তার পরীক্ষার ব্যতিক্রম ঘৃণা করবেন না। পরিবর্তে, এমন ব্যতিক্রমগুলি ঘৃণা করুন যা পরীক্ষার ব্যতিক্রমগুলিকে অত্যধিক ব্যবহার করে।


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

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

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

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

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

আমি আবার, সময় এবং সময় পেয়েছি, এবং আমি যে প্রকল্পটি উল্লেখ করেছি, তার মধ্যে ব্যতিক্রম ব্যতিক্রম হ'ল 3 টি বিভাগে পড়েছে:

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

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

চেক ব্যতিক্রম সঙ্গে আমার প্রধান গরুর মাংস তারা polymorphism ধ্বংস। পলিমারফিক ইন্টারফেসের সাথে চমত্কারভাবে খেলা করা অসম্ভব।

ভাল ol 'জাভা List ইন্টারফেস নিন। আমরা LinkedList এবং 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) প্রকাশ করে, আপনি আইটেমগুলি ( list.get(123) ) পুনরুদ্ধার করতে পারেন অথবা WidgetList নিজেই জানতে WidgetList for (Widget w : list) ... একটি তালিকা পুনরুক্তি করতে পারেন। জেনারিক তালিকা ব্যবহার করে এমন কোনও স্ট্যান্ডার্ড পদ্ধতিতে এই তালিকাটি পাঠানো যাবে, বা এটি একটি Collections.synchronizedList । সিঙ্ক্রোনাইজড লিস্টে মোড়ানো হবে। যে কোডটি ব্যবহার করে সেটি কোনও "উইজেট" স্পট-এ তৈরি করা হয় না তা কোনও অ্যারের কাছ থেকে পাওয়া যায় না বা কোনও ফাইল, বা ডাটাবেস থেকে, নেটওয়ার্ক থেকে বা ভবিষ্যতে সাবস্পেস রিলে থেকে পড়তে হয় না সে সম্পর্কে কোনও জানা নেই বা তারও যত্ন নেই। এটি এখনও সঠিকভাবে কাজ করবে কারণ List ইন্টারফেস সঠিকভাবে প্রয়োগ করা হয়েছে।

এটা ছাড়া না। উপরের ক্লাসটি কম্পাইল হয় না কারণ ফাইল অ্যাক্সেস পদ্ধতিগুলি একটি 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 ঠিক এই ক্ষেত্রেই একটি অচেষ্টিত IOException ক্লাস যুক্ত করেছে: IOException এক্সপেশনসকে IOException পদ্ধতির সীমানা জুড়ে ধরে এবং পুনঃস্থাপনের জন্য। আমার পয়েন্ট প্রমাণ করে!))

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

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

প্রকৃতপক্ষে, আপনি হ্যাক অবলম্বন যদি আপনি undclclared চেক ব্যতিক্রম ব্যতিক্রম করতে পারেন। রান সময় সময়ে, 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);
    }
}

দুর্ভাগ্যবশত, পরীক্ষার ব্যতিক্রমগুলির চূড়ান্ত অপমান হল যে কম্পাইলার আপনাকে একটি পরীক্ষিত ব্যতিক্রম ধরতে দেয় না যদি তার ত্রুটিযুক্ত মতামতটি এটিকে নিক্ষেপ করা না যায়। (অনির্ধারিত ব্যতিক্রমগুলিতে এই নিয়ম নেই।) চটজলদিভাবে নিক্ষিপ্ত ব্যতিক্রমটি ধরতে হলে আমাদের এটি করতে হবে:

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চেকটি টাইপ করা হয়েছে, জাভার 7 এ যোগ করা একটি নিয়মকে ধন্যবাদ যা ধরা ব্যতিক্রমগুলি পুনরুদ্ধারের জন্য।

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

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

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

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

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

একটি GUI বা স্বয়ংক্রিয় প্রোগ্রামে মুদ্রিত বার্তা দেখা হবে না। খারাপ, এটি ব্যতিক্রম পরে কোড বাকি সঙ্গে plows। ব্যতিক্রম আসলে একটি ত্রুটি না? তারপর এটা প্রিন্ট করবেন না। নাহলে, অন্য কিছু এক মুহুর্তে উষ্ণ হতে যাচ্ছে, যার দ্বারা মূল ব্যতিক্রম বস্তু চলে যাবে। এই idiom বেসিক এর On Error Resume Nextবা পিএইচপি এর চেয়ে ভাল নয়error_reporting(0);

লগগার শ্রেণির কোন ধরনের কল অনেক ভাল নয়:

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

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

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

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


পরীক্ষিত ব্যতিক্রম সম্পর্কে জিনিসটি আসলে ধারণাটির স্বাভাবিক বোঝার দ্বারা ব্যতিক্রম নয়। পরিবর্তে, তারা API বিকল্প ফেরত মান।

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

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

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

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

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

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

এবং তারপর শুধু হাস্যকর লাইব্রেরি ব্যতিক্রম প্রচুর আছে:

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

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

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

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


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

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

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

আমি এটি দেখেছি কতবার গণনা হারিয়ে ফেলেছি:

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

কেন? কারণ কেউ এটি মোকাবেলা করতে এবং অলস ছিল। এটা কি ভুল ছিল? অবশ্যই। এটা কি ঘটবে? একেবারে। এই পরিবর্তে একটি unchecked ব্যতিক্রম ছিল কি? অ্যাপ্লিকেশনটি শুধু মারা গিয়েছিল (যা একটি ব্যতিক্রম নষ্ট করার পক্ষে সর্বাধিক)।

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

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


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

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

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

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

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

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

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

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

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

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


Here চেক ব্যতিক্রমগুলির বিরুদ্ধে এক যুক্তি (joelonsoftware.com থেকে):

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

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

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

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

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

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

পাবলিক অকার্যকর রান () {

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

}

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

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


কেউ উল্লেখ করা একটি গুরুত্বপূর্ণ জিনিস এটি ইন্টারফেস এবং lambda এক্সপ্রেশন সঙ্গে হস্তক্ষেপ কিভাবে।

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

আপনি না কিছু ইন্টারফেস বাস্তবায়ন করতে চান না হওয়া পর্যন্ত সব ঠিক দেখাচ্ছে। স্পষ্টতই এটি নিক্ষেপ করার উদ্দেশ্য ঘোষণা করে না MyApException, তাই কম্পাইলার আপনাকে সেখানে থেকে ব্যতিক্রম নিক্ষেপ করার অনুমতি দেয় না।

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


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

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

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


শুধুমাত্র অনুপযুক্ত প্রশ্নের ঠিকানা দিতে চেষ্টা করুন:

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

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

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

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

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


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


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

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

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

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

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


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

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

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


আর্টিমা এনইটি, আন্ডার্স হেলসবার্গের স্থপতির http://www.artima.com/intv/handcuffs.html সাথে http://www.artima.com/intv/handcuffs.html , যা যাচাই ব্যতিক্রমগুলির বিরুদ্ধে যুক্তিযুক্তভাবে আচ্ছাদিত করে। একটি সংক্ষিপ্ত টাস্টার:

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


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

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

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

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

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

যদি আমাদের আবেদনটি ডিবি না হয় তবে আমরা ডিবি চেষ্টা ও সমাধান করতে পারি না। যে encapsulation নীতি লঙ্ঘন করবে ।

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

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

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

অবশেষে, "চেক ব্যতিক্রম" FP কার্যকরী প্রোগ্রামিং এর সাথে বেশ অসঙ্গতিপূর্ণ।

তাদের "অবিলম্বে হ্যান্ডেল" এ জোর দেওয়া উভয় "ধরা দেরী" ব্যতিক্রম-হ্যান্ডলিং সর্বোত্তম অনুশীলন, এবং যে কোনও FP কাঠামো যা লুপ / ​​নিয়ন্ত্রণ প্রবাহ উভয় সঙ্গে বিজড়িত হয়।

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

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

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

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

দেখুন:
- literatejava.com/exceptions/… - literatejava.com/exceptions/…


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

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

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

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

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

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

যদি আমরা চেক ব্যতিক্রমটি বাদ দিই তবে আমরা ফাংশনের জন্য রিটার্ন টাইপটি বাদ দিতে পারি এবং সর্বদা "anytype" পরিবর্তনশীলকে ফেরত দিতে পারি ... যা জীবনকে আরও সহজ করে তুলবে?


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

জাভা মধ্যে চেক ব্যতিক্রম পরের সমস্যা সমাধান না; C # এবং VB.NET বাথরুম দিয়ে শিশুর নিক্ষেপ করুন।

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

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

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


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

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

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





checked-exceptions