কেন কোনও পদ্ধতিতে একাধিক প্রকারের চেক করা ব্যতিক্রম ছোঁড়া উচিত নয়?


47

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

সর্বজনীন পদ্ধতিতে সর্বাধিক এক পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলা উচিত

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

কলারদের জটিলতা যুক্তিসঙ্গত রাখতে, পদ্ধতিতে একাধিক ধরণের পরীক্ষিত ব্যতিক্রম ছোঁড়া উচিত নয়। "

সোনার আরেকটি বিট আছে এই :

সর্বজনীন পদ্ধতিতে সর্বাধিক এক পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলা উচিত

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

কলারদের জন্য জটিলতা যুক্তিযুক্ত রাখতে, পদ্ধতিগুলিতে একাধিক ধরণের পরীক্ষিত ব্যতিক্রম ছোঁড়া উচিত নয়।

নিম্নলিখিত কোড:

public void delete() throws IOException, SQLException {      // Non-Compliant
  /* ... */
}

এর মধ্যে রিফ্যাক্টর করা উচিত:

public void delete() throws SomeApplicationLevelException {  // Compliant
    /* ... */
}

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

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

এটি কি একটি স্বীকৃত মান?


7
আমাদের কি করতে আপনি মনে করেন? সোনারকিউব থেকে আপনি যে ব্যাখ্যাটি উদ্ধৃত করেছেন তা বুদ্ধিমান বলে মনে হচ্ছে; সন্দেহ করার কোনও কারণ আছে কি?
রবার্ট হার্ভে

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

উত্তর:


32

আপনার প্রদত্ত কোডটি এমন পরিস্থিতিতে বিবেচনা করুন:

public void delete() throws IOException, SQLException {      // Non-Compliant
  /* ... */
}

এখানে বিপদটি হ'ল আপনি যে কোডটি কল করতে লিখছেন delete()সেটির মতো দেখাবে:

try {
  foo.delete()
} catch (Exception e) {
  /* ... */
}

এটিও খারাপ। এবং এটি অন্য নিয়মের সাথে ধরা পড়বে যেগুলি বেস ব্যাতিক্রম শ্রেণীর পতাকাগুলি ধরে রাখে।

মূলটি হ'ল কোডটি লিখিত না যা আপনাকে অন্য কোথাও খারাপ কোড লিখতে চায়।

আপনি যে নিয়মের মুখোমুখি হচ্ছেন তা একটি সাধারণ বিষয়। চেকস্টাইলটিতে এটির নকশার নিয়ম রয়েছে:

ThrowsCount

নির্দিষ্ট গুনে স্ট্রোটমেন্টগুলিকে সীমাবদ্ধ করে (ডিফল্টরূপে 1)।

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

এটি সমস্যাটি এবং সমস্যাটি কী এবং আপনার এটি কেন করা উচিত নয় তা স্পষ্টভাবে বর্ণনা করে। এটি একটি স্বীকৃত মান যে অনেক স্থিতিশীল বিশ্লেষণ সরঞ্জাম সনাক্ত এবং পতাকাঙ্কিত করবে।

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

আপনার শ্রেণীর ব্যবহারকারী লোকগুলিকে খারাপ কোড লিখতে চান না।


আমার উল্লেখ করতে হবে যে জাভা এসই 7 এর সাথে এর গুরুত্ব কম হয়েছে কারণ একক ক্যাপ স্টেটমেন্ট একাধিক ব্যতিক্রম ( ওরেল থেকে উন্নত প্রকারের চেকিংয়ের সাথে একাধিক ব্যতিক্রমের ধরণ এবং পুনর্বিবেচনা ব্যতিক্রমগুলি ) ধরতে পারে catch

জাভা 6 এবং এর আগে, আপনার কাছে এমন কোড থাকবে যা দেখতে দেখতে লাগবে:

public void delete() throws IOException, SQLException {
  /* ... */
}

এবং

try {
  foo.delete()
} catch (IOException ex) {
     logger.log(ex);
     throw ex;
} catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}

অথবা

try {
    foo.delete()
} catch (Exception ex) {
    logger.log(ex);
    throw ex;
}

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

দ্বিতীয় বিকল্পটি বেশ কয়েকটি কারণে খারাপ। প্রথমত, এর অর্থ হ'ল আপনি সমস্ত ব্যতিক্রমগুলি ধরছেন। নাল পয়েন্টার সেখানে ধরা পড়ে (এবং এটি করা উচিত নয়)। উপরন্তু, আপনি একটি rethrowing হয় Exceptionযার মানে পদ্ধতি স্বাক্ষর হবে deleteSomething() throws Exceptionযা শুধু আপনার কোড ব্যবহার এখন হয় স্ট্যাক আপ আরও একটি জগাখিচুড়ি তোলে বাধ্য করার catch(Exception e)

জাভা 7 সঙ্গে, এই নয় হিসাবে কারণ আপনার পরিবর্তে কি করতে পারেন গুরুত্বপূর্ণ:

catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

তদুপরি, টাইপ চেকিং যদি কেউ ফেলে দেওয়া ব্যতিক্রমগুলির ধরণগুলি ধরা দেয় তবে :

public void rethrowException(String exceptionName)
throws IOException, SQLException {
    try {
        foo.delete();
    } catch (Exception e) {
        throw e;
    }
}

টাইপ পরীক্ষক যে চিনতে পারবে eপারে শুধুমাত্র ধরনের হতে IOExceptionবা SQLException। আমি এখনও এই স্টাইলের ব্যবহার সম্পর্কে অত্যধিক উত্সাহী নই, তবে এটি জাভা 6 এর অধীনে যেমন খারাপ কোড তৈরি করছে না (যেখানে এটি আপনাকে মেথডের স্বাক্ষরটি ব্যতিক্রমগুলি প্রসারিত করে এমন সুপারক্লাস হতে বাধ্য করবে)।

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

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


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

"প্রকার চেকার স্বীকৃতি জানাতে পারে যে ই কেবলমাত্র IOException বা SQLException প্রকারের হতে পারে" ": এর অর্থ কী? যখন অন্য ধরণের একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয় তখন কী হয় foo.delete()? এটি কি এখনও ধরা পড়ে এবং পুনর্নির্মাণ হয়?
জর্জিও

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

আমি দেখি. এটি আমার কাছে কিছুটা সংশ্লেষিত মনে হচ্ছে। আমি এটিকে নিষিদ্ধ করা catch (Exception e)এবং এটির পরিবর্তে হয় catch (IOException e)বা catch (SQLException e)পরিবর্তে বাধ্য করা আরও স্বজ্ঞাত মনে করব ।
জর্জিও

@ জিওর্জিও ভাল কোড লেখার পক্ষে আরও সহজ করার চেষ্টা করার জন্য এটি জাভা 6 থেকে এক বাড়ানো পদক্ষেপ। দুর্ভাগ্যক্রমে, খারাপ কোডটি লেখার বিকল্পটি দীর্ঘ সময়ের জন্য আমাদের সাথে থাকবে। মনে রাখবেন যে জাভা 7 এর catch(IOException|SQLException ex)পরিবর্তে করতে পারে । তবে, আপনি যদি কেবল ব্যতিক্রমটি পুনর্বিবেচনা করতে চলেছেন তবে টাইপ চেকারকে কোডটি সহজ করে দেওয়ার ব্যতিক্রমের প্রকৃত প্রকারটি প্রচার করার অনুমতি দেওয়া কোনও খারাপ জিনিস নয়।

22

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

ধরা যাক আমাদের একটি পদ্ধতি রয়েছে যা অধ্যবসায় থেকে ডেটা আনবে এবং সেই অধ্যবসায় ফাইলগুলির একটি সেট। যেহেতু আমরা ফাইলগুলি নিয়ে কাজ করছি তাই আমাদের একটি থাকতে পারে FileNotFoundException:

public String getData(int id) throws FileNotFoundException

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

public String getData(int id) throws SQLException

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

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

public String getData(int id) throws InvalidRecordException

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


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

public Record parseFile(String filename) throws IOException, ParseException

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

public String readFile(String filename) throws IOException
public Record parse(String data) throws ParseException

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


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


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

@ এসডোকা যদি আপনার updateপদ্ধতিটি যতটা পারমাণবিক হয় তবে আপনি এটি তৈরি করতে পারেন এবং ব্যতিক্রমগুলি বিমূর্ততার যথাযথ স্তরে রয়েছে, তবে হ্যাঁ, মনে হচ্ছে আপনার দুটি ভিন্ন ধরনের ব্যতিক্রম ছোঁড়াতে হবে কারণ দুটি ব্যতিক্রমী মামলা রয়েছে। এগুলি (কখনও কখনও স্বেচ্ছাচারী) লিন্টার নিয়মের চেয়ে কয়টি ব্যতিক্রম ছোঁড়া যায় তার পরিমাপ এটি হওয়া উচিত।
cbojar

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

+1: আমি এই উত্তরটি অনেক পছন্দ করি, বিশেষত কারণ এটি মডেলিং দৃষ্টিকোণ থেকে সমস্যাটি সমাধান করে। প্রায়শই এটি অন্য আইডিয়োম (পছন্দ করা catch (IOException | SQLException ex)) ব্যবহার করার প্রয়োজন হয় না কারণ আসল সমস্যাটি প্রোগ্রামের মডেল / ডিজাইনে।
জর্জিও

3

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

http://tutorials.jenkov.com/java-exception-handling/checked-or-unchecked-exceptions.html

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

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

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

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


2
কেন Throwableআপনার নিজের নিজস্ব শ্রেণিবিন্যাস আবিষ্কারের পরিবর্তে কেবল ছোঁড়াগুলি ঘোষণা করা এবং এটি দিয়ে কাজ করা হবে না?
উত্সাহক

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

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

1
@ ডেডুপ্লিকেটর আমি এই ধারণাকে সমর্থন করছি না এবং আমি অবশ্যই এটির পক্ষেও চাই না। আমি কেবল সেদিকেই কথা বলছি যেখানে ওপি দেওয়া পরামর্শটি সম্ভবত এসেছে coming
Panzercrisis

1
লিঙ্কের জন্য ধন্যবাদ। এই বিষয়টি পড়ার জন্য এটি শুরু করার এক দুর্দান্ত জায়গা ছিল।
sdoca

-1

যখন একাধিক যুক্তিসঙ্গত কাজ করার দরকার আছে তখন একাধিক পরীক্ষিত ব্যতিক্রম ছোঁয়াছুটি বোঝায়।

উদাহরণস্বরূপ বলা যাক আপনার পদ্ধতি আছে

public void doSomething(Credentials cred, Work work) 
    throws CredentialsRequiredException, TryAgainLaterException{...}

এটি বোনা ব্যতিক্রমী বিধি লঙ্ঘন করে তবে তা উপলব্ধি করে।

দুর্ভাগ্যক্রমে, সাধারণত যা ঘটে তা হ'ল পদ্ধতিগুলির মতো

void doSomething() 
    throws IOException, JAXBException,SQLException,MyException {...}

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

অতএব সর্বাধিক এক পরীক্ষিত ব্যতিক্রম শাসন করুন।

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

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


1
"একাধিক যুক্তিসংগত কিছু করার" কমই মেনে চলতে SRP - এই বিন্দুতে পরিপূর্ণ ছিল পূর্বে উত্তর
মশা

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