আমি কি একই ক্যাচ ক্লজে একাধিক জাভা ব্যতিক্রম ধরতে পারি?


699

জাভাতে, আমি এই জাতীয় কিছু করতে চাই:

try {
    ...     
} catch (/* code to catch IllegalArgumentException, SecurityException, 
            IllegalAccessException, and NoSuchFieldException at the same time */) {
   someCode();
}

...পরিবর্তে:

try {
    ...     
} catch (IllegalArgumentException e) {
    someCode();
} catch (SecurityException e) {
    someCode();
} catch (IllegalAccessException e) {
    someCode();
} catch (NoSuchFieldException e) {
    someCode();
}

এই কাজ করতে কোন উপায় আছে কি?

উত্তর:


1130

জাভা 7 সাল থেকে এটি সম্ভব হয়েছে । মাল্টি-ক্যাচ ব্লকের সিনট্যাক্সটি হ'ল:

try { 
  ...
} catch (IOException | SQLException ex) { 
  ...
}

তবে মনে রাখবেন যে সমস্ত ব্যতিক্রম যদি একই শ্রেণীর শ্রেণিবিন্যাসের অন্তর্ভুক্ত থাকে তবে আপনি কেবল সেই বেস ব্যতিক্রমের ধরণটি ধরতে পারেন।

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

Alternatives in a multi-catch statement cannot be related by subclassing
  Alternative ExceptionB is a subclass of alternative ExceptionA

81
টিটি - কেন bitwise or( |) অপারেটরটিকে নতুন করে সংজ্ঞায়িত করবেন ? কেন কমা, বা অপারেটরটির আরও সদৃশ অর্থ আছে, logical or( ||)?
আর্টঅফ ওয়ারফেয়ার

11
@ আর্টঅফ ওয়ারফেয়ার সম্ভবত তারা ভেবেছিল যে তারা জেনেরিকের জন্য একাধিক সীমাবদ্ধতার জন্য সিন্টেক্সটি নিয়ে আসার পরে আর কোনও বিষয় হবে না ।
জিমিবি

12
এক্সওআর চিহ্ন (I) ওআর (||), এ | এর মতো নয় বি এর অর্থ হয় A বা B তবে এ দুটোই নয় || বি এর অর্থ A বা B বা উভয় তাই ব্যতিক্রম হিসাবে এটি হয় ব্যতিক্রম A বা ব্যতিক্রম B তবে একই সাথে উভয়ই নয়। এ কারণেই তারা OR এর পরিবর্তে XOR গাওয়া ব্যবহার করেছিল এবং আপনি স্পষ্টভাবে দেখতে পাবেন যে ব্যতিক্রম ছোঁড়া হলে আপনি 2 ব্যতিক্রমগুলি রাখেন তার মধ্যে
একটির অন্যরকমের উপকার রয়েছে

41
জাভাতে @ ব্যবহারকারী 1512999, বিটওয়াইজ এক্সওআর হ'ল care (ক্যারেট) এবং বিটওয়াইস OR | (পাইপ) ডকস.অরাকল.com
লুইস বাউমস্টার্ক

6
এটি উল্লেখ করার মতো যে মাল্টি-ক্যাচ ব্লকে ধরা পড়ার ব্যতিক্রমটির ধরণটি সবচেয়ে
উত্সযুক্ত

104

জাভা 7 এর ঠিক আগে নয়, আমি এরকম কিছু করব:

জাভা 6 এবং তার আগে

try {
  //.....
} catch (Exception exc) {
  if (exc instanceof IllegalArgumentException || exc instanceof SecurityException || 
     exc instanceof IllegalAccessException || exc instanceof NoSuchFieldException ) {

     someCode();

  } else if (exc instanceof RuntimeException) {
     throw (RuntimeException) exc;     

  } else {
    throw new RuntimeException(exc);
  }

}



জাভা 7

try {
  //.....
} catch ( IllegalArgumentException | SecurityException |
         IllegalAccessException |NoSuchFieldException exc) {
  someCode();
}

11
নোট করুন যে আপনার জাভা 6 উদাহরণটি কম্পাইলারের কোথা থেকে নিক্ষিপ্ত হবে তা বলার ক্ষমতা ভঙ্গ করে।
মাইকেলব্লিউম

2
@ মিশেলব্লিউম সত্য, যা খারাপ নয় is আপনি সর্বদা এর সাথে মূল ব্যতিক্রমটি পেতে পারেন exc.getCause()। পার্শ্ব নোট হিসাবে, রবার্ট সি মার্টিন (অন্যদের মধ্যে) চেক না করা ব্যতিক্রমগুলি ব্যবহার করার পরামর্শ দিয়েছেন (সংকলকটি সেখান থেকে কী ধরণের ব্যতিক্রম ছোঁড়াবে সে সম্পর্কে কোনও ধারণা নেই); পড়ুন ত্রুটি পরিচালনা: অধ্যায় 7 তার বই তে ক্লিন কোড
ব্যবহারকারী 45432222

4
আপনার জাভা 6 উদাহরণে না আপনি আসল ব্যতিক্রম rethrowing পরিবর্তে একটি নতুন ব্যতিক্রম দৃষ্টান্ত তৈরি করার সময়, অর্থাত হওয়া উচিত throw excপরিবর্তে throw new RuntimeException(exc)?
ডেভিড ডিমার

5
পাঠযোগ্যতার দৃষ্টিকোণ থেকে এটি বেশ খারাপ অভ্যাস।
রাজেশ জে আদভানি

3
ইনস্ট্যান্সফের অপারেশনটি কিছুটা ব্যয়বহুল, যতটা সম্ভব এড়ানো ভাল।
পরমেশ কোরাকাকুতি

23

জাভা 7 এর মধ্যে আপনি একাধিক ক্যাচ ক্লজগুলি সংজ্ঞায়িত করতে পারেন:

catch (IllegalArgumentException | SecurityException e)
{
    ...
}

16

যদি ব্যতিক্রমগুলির শ্রেণিবিন্যাস থাকে তবে আপনি ব্যতিক্রমের সমস্ত সাবক্লাসটি ধরতে বেস শ্রেণিটি ব্যবহার করতে পারেন। অধঃপতনের ক্ষেত্রে আপনি সমস্ত জাভা ব্যতিক্রমগুলি এর সাথে ধরতে পারেন :

try {
   ...
} catch (Exception e) {
   someCode();
}

আরও সাধারণ ক্ষেত্রে যদি RepositoryException হল বেস ক্লাস এবং পাথনটফাউন্ডএক্সেপশন তখন একটি উত্পন্ন শ্রেণি:

try {
   ...
} catch (RepositoryException re) {
   someCode();
} catch (Exception e) {
   someCode();
}

উপরের কোডটি এক ধরণের ব্যতিক্রম হ্যান্ডলিংয়ের জন্য RepositoryException এবং PathNotFoundException ধরে ফেলবে এবং অন্য সমস্ত ব্যতিক্রম একসাথে লম্পড হয়েছে। জাভা 7 যেহেতু উপরের @ অস্কারেরাইজের উত্তর অনুসারে:

try { 
  ...
} catch( IOException | SQLException ex ) { 
  ...
}

7
বিটিডাব্লু ক্যাচ ক্লজগুলি যথাযথভাবে পরিচালনা করা হয় তাই আপনি যদি কোনও শিশু শ্রেণির আগে পিতামাতার ব্যতিক্রমী ক্লাস রাখেন তবে এটিকে কখনই বলা হয় না: চেষ্টা করুন {...} ক্যাচ (ব্যতিক্রম ই) {সামান্য কোড (); } ক্যাচ (রিপোজিটরিএক্সেপশন পুনরায়) {// কখনই পৌঁছায় না}
মাইকেল শপসিন

4
প্রকৃতপক্ষে স্পষ্টভাবে কারণ এটি কখনই পৌঁছানো যায় না, এই জাতীয় কোড এমনকি সংকলন করে না।
বহুগেনুবিক্যান্টস

15

না, গ্রাহক প্রতি একজন

যতক্ষণ না আপনি সমস্ত ক্ষেত্রে একই পদক্ষেপ গ্রহণ করেন আপনি java.lang.Exception এর মতো একটি সুপারক্লাস ধরতে পারেন।

try {
    // some code
} catch(Exception e) { //All exceptions are caught here as all are inheriting java.lang.Exception
    e.printStackTrace();
}

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


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

2
আমি এটি সম্পর্কে জানতাম, তবে আমি এটি করতে চাই না ... ওহ, ভাল, অনুমান করুন আমি তখন জাভা পরবর্তী সংস্করণ
অবধি

@ ডিফাইমো: লগিং এবং পুনর্বিবেচনাতে কী দোষ হয়েছে? এটি কোডকে বিশৃঙ্খলা ব্যতীত, এটি এটি না ধরার সমতুল্য, তাই না। সাধারণ ত্রুটি-পরিচালনার কৌশল দৃষ্টিকোণ থেকে দেখা। যা খারাপ তা হ'ল লগিং এবং পুনর্বিবেচনা নয়
ফ্র্যাঙ্ক ওস্টারফেল্ড

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

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

10

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

এই ক্ষেত্রে:

try {
    // CODE THAT THROWS EXCEPTION
} catch (Exception e) {
    if (e instanceof RuntimeException) {
        // this exception was not expected, so re-throw it
        throw e;
    } else {
        // YOUR CODE FOR ALL CHECKED EXCEPTIONS
    } 
}

বলা হচ্ছে, ভারবোসিটির জন্য, বুলেয়ান বা অন্য কোনও ভেরিয়েবল সেট করা ভাল এবং চেষ্টা-ব্লকের পরে কিছু কোড কার্যকর করতে পারে তার উপর ভিত্তি করে।


1
এই পদ্ধতিটি "ক্যাচ ব্লক" পৌঁছনীয় হবে কিনা তা নির্ধারণ করতে সংকলককে বাধা দেয়।
the_new_mr

3

প্রাক -7 এ কেমন সম্পর্কে:

  Boolean   caught = true;
  Exception e;
  try {
     ...
     caught = false;
  } catch (TransformerException te) {
     e = te;
  } catch (SocketException se) {
     e = se;
  } catch (IOException ie) {
     e = ie;
  }
  if (caught) {
     someCode(); // You can reference Exception e here.
  }

3
সুন্দর সমাধান হতে পারে। কিভাবে caughtএকটি finallyব্লক চূড়ান্ত নিয়ন্ত্রণ সন্নিবেশ ?
Andrea_86

এর জন্য মূল প্রশ্নের চেয়ে বেশি লাইন দরকার।
লেয়ানড্রো গ্লসম্যান

1

হ্যাঁ. পাইপ (|) বিভাজকটি ব্যবহার করার উপায় এখানে রয়েছে,

try
{
    .......
}    
catch
{
    catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
}

এই কোড শৈলী কি? ক্যাচ ব্লক একটি চেষ্টা ব্লক?
স্যাম

1

কোটলিনের পক্ষে এটি এখনই সম্ভব নয় তবে তারা এটি যুক্ত করার কথা বিবেচনা করেছেন: উত্স
কিন্তু আপাতত, কেবল একটি সামান্য কৌশল:

try {
    // code
} catch(ex:Exception) {
    when(ex) {
        is SomeException,
        is AnotherException -> {
            // handle
        }
        else -> throw ex
    }
}

0

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

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