ফাইল পড়ার ও লেখার মাধ্যমে ছুঁড়ে দেওয়া সমস্ত ব্যতিক্রম আমি কীভাবে ধরব?


106

জাভাতে, exceptionsব্যতিক্রম পৃথকভাবে ধরার পরিবর্তে সমস্ত কি (ক্যাচ) পাওয়ার কী উপায় আছে ?


4
এবং আমি সেই সমস্ত নির্দিষ্ট ব্যতিক্রমকে ধরা দিয়ে ধরব (ব্যতিক্রম ই) {} ??
জোহানা

হ্যাঁ যেহেতু ব্যতিক্রম সমস্ত ব্যতিক্রমের বেস শ্রেণি, তাই এটি কোনও ব্যতিক্রম ধরা পড়বে।
jjnguy

4
@ জেজেংুই: আপনার ভাল ব্যাখ্যার জন্য ধন্যবাদ
জোহানা

আমি আনন্দিত এটি সহায়ক ছিল।
jjnguy

উত্তর:


111

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

কোডটি দেখে মনে হচ্ছে:

public void someMethode() throws SomeCheckedException {

    //  code

}

তারপরে আপনি exceptionsযদি সেই পদ্ধতিতে তাদের সাথে ডিল করতে না চান তবে আপনি তার সাথে ডিল করতে পারেন ।

সমস্ত ব্যতিক্রম ধরতে কোডের কিছু ব্লক আপনি করতে পারেন: (এটি আপনাকে Exceptionsনিজের লেখা বলেও ধরা দেবে )

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

যে কারণে কাজ করে তা Exceptionহ'ল সমস্ত ব্যতিক্রমের জন্য বেস শ্রেণি। সুতরাং নিক্ষিপ্ত হতে পারে যে কোনও ব্যতিক্রম হ'ল Exception(বড় হাতের 'ই')।

আপনি যদি নিজের ব্যতিক্রমগুলি পরিচালনা করতে চান তবে প্রথমে catchসাধারণ ব্যতিক্রমের আগে একটি ব্লক যুক্ত করুন ।

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

95

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

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

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

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}

13
কেন একাধিক ক্যাচ ব্লক ব্যবহার করবেন না?
কার্ল জি

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

যে নিক্ষেপযোগ্য দরকারী ছিল।
আনশুল

এটি সমাধানটি আমি সন্ধান করছিলাম, ব্যতিক্রম হ্যান্ডলিংয়ের জন্য আমার আর একটি দরকার ছিল। ধন্যবাদ
কিউবজকি

নিক্ষেপযোগ্য টিপ সত্যিই দরকারী।
চেরিহিটেক

15

বেস ব্যতিক্রম 'ব্যতিক্রম' ধরুন

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

8
আপনি যদি এই কোডটি লিখেন তবে আপনি অবশ্যই খুব ভয়ঙ্কর কিছু করছেন।
জর্জ

4
@ জর্জি আপনি কেন বলেছেন?
কুচি

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

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

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

6

এক্সেপশন ধরতে এটি খারাপ অনুশীলন - এটি কেবল খুব বিস্তৃত এবং আপনি নিজের কোডে নুলপয়েন্টার এক্সসেপশন এর মতো কিছু মিস করতে পারেন ।

বেশিরভাগ ফাইল অপারেশনের জন্য, আইওএক্সেপশন হ'ল মূল ব্যতিক্রম। তার পরিবর্তে, এটি ধরা ভাল।


4
এটি ব্যতিক্রম ধরা খারাপ অভ্যাস। কেন? ডাউনভোট খারাপ ব্যাখ্যা করেছেন
পেড্রো


4

আপনি একক ক্যাচ ব্লকে একাধিক ব্যতিক্রম ধরতে পারেন।

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 

3

আপনি কি নির্দিষ্ট ধরণের ব্যতিক্রমগুলির বিপরীতে নিক্ষেপ করা Exceptionকোনও ধরণের ধরণটি বোঝাতে চান ?

যদি তাই:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

নির্দিষ্ট নয় এমনদের জন্য আমার কী করা উচিত ??
জোহানা

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