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




exception try-catch (6)

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

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

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


একটি ক্লিনার (কিন্তু কম verbose, এবং সম্ভবত পছন্দের হিসাবে নয়) জাভা 6 (অর্থাৎ, অ্যান্ড্রয়েড) ব্যবহারকারীর 445২2 এর উত্তরের বিকল্পটি সমস্ত Exception ধরতে এবং RuntimeException পুনঃ-নিক্ষেপ 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
    } 
}

বলা হচ্ছে, ক্রিয়াপদার্থের জন্য, বুলিয়ান বা অন্য কিছু পরিবর্তনশীল সেট করা ভাল এবং এটির উপর ভিত্তি করে try-catch ব্লকের পরে কিছু কোড কার্যকর করা যেতে পারে।


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

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

আপনি java.lang.exception মত একটি superclass ধরতে পারেন, যতক্ষণ আপনি সব ক্ষেত্রে একই পদক্ষেপ গ্রহণ।

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

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


প্রাক-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.
  }

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

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

আরও সাধারণ ক্ষেত্রে যদি রেজোজিটিক্স এক্সপেশনটি বেস বর্গ এবং PathNotFoundException তাহলে একটি প্রাপ্ত শ্রেণিবদ্ধ হয়:

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

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

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

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

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






multi-catch