मैं उन सभी अपवादों को कैसे पकड़ सकता हूं जिन्हें एक फ़ाइल को पढ़ने और लिखने के माध्यम से फेंक दिया जाएगा?


105

जावा में, क्या exceptionsव्यक्तिगत रूप से अपवाद को पकड़ने के बजाय सभी को पकड़ना (पकड़ना) है ?


2
और मैं उन सभी विशिष्ट अपवादों को पकड़ लूंगा (अपवाद ई) {} ??
जोहाना

हाँ। चूंकि अपवाद सभी अपवादों का आधार वर्ग है, इसलिए यह किसी भी अपवाद को पकड़ लेगा।
jjnguy

1
@ jjnguy: आपकी अच्छी व्याख्या के लिए धन्यवाद।
जोहाना

मुझे खुशी है कि यह मददगार था।
१:57:०४ पर 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;
    }
}

12
क्यों कई पकड़ ब्लॉक का उपयोग नहीं करते?
कार्ल जी

1
मेरा तर्क है कि आपको प्रत्येक अपवाद को स्पष्ट रूप से पकड़ना चाहिए, लेकिन प्रश्न ने स्पष्ट रूप से पूछा कि कैसे सब कुछ को पकड़ने के लिए कोड का एक ब्लॉक फेंकना होगा।
कोडेथुलु

वह फेंकने योग्य था।
अंशुल

यह वह समाधान है जिसकी मुझे तलाश थी, अपवाद स्वरूप हैंडलिंग के लिए मुझे एक और की आवश्यकता थी। धन्यवाद
CubeJockey

थ्रोबल टिप वास्तव में उपयोगी है।
चेरीटेक

15

आधार अपवाद को पकड़ो 'अपवाद'

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

8
यदि आप इस कोड को लिखते हैं, तो आप निश्चित रूप से बहुत कुछ गलत कर रहे हैं।
जॉर्ज

2
@ जॉर्ज आप ऐसा क्यों कहते हैं?
कूची

10
@ आवश्यक नहीं, यदि आप किसी ऐसी चीज से निपटते हैं, जिसमें बहुत सारे संवेदनशील प्रवेश पैरामीटर हैं और उनमें से प्रत्येक की वैधता को सत्यापित करना बहुत जटिल है, तो सभी प्रकार के अपवादों को पकड़ लेना एक बार काम करने के मामलों को ठीक से जांचने का तरीका है। । यह एक विशाल और संभावित भारी स्थिति की तुलना में कोड को स्पष्ट और कम माइंडफ * k बना देगा।

2
अधिकांश कोडर्स मैंने उनके कैच स्टेटमेंट्स में कुछ भी नहीं डालने के साथ काम किया है, इसलिए इस कोशिश को पकड़ने के लिए स्निपेट का उपयोग करना वास्तव में विभिन्न अपवाद प्रकारों के एक समूह को पकड़ने से बेहतर है और इसके साथ कुछ भी नहीं करना है
लो मोर्डा

1
@LouisMorda मैं असहमत हूं, प्रत्येक अपवाद उपवर्ग को पकड़ना और उनके आधार पर कुछ भी नहीं करना (उन्हें अनदेखा करना) केवल कुछ विशिष्ट अपवादों को पकड़ने और उन्हें अनदेखा करने से भी बदतर है। यदि आप कुछ अपवाद प्रकारों को पकड़ते हैं और जानकारी के साथ कुछ नहीं करते हैं, तो आपको यह जानने का कोई मौका नहीं है कि उन स्थितियों में क्या गलत हुआ, लेकिन यदि आप सभी अपवाद उपवर्गों को पकड़ते हैं, तो आपको यह जानने का कोई मौका नहीं है कि बहुत बड़ी संख्या में क्या गलत हुआ स्थितियों की। इस बात पर विचार करें कि आप अपवादों की जानकारी के बिना बग रिपोर्ट कैसे संभालेंगे, जैसे स्टैकट्रैक्स और संदेश।
zpon

6

अपवाद को पकड़ने के लिए यह बुरा अभ्यास है - यह बहुत व्यापक है, और आप NullPointerException की तरह कुछ याद कर सकते हैं अपने स्वयं के कोड में ।

अधिकांश फ़ाइल संचालन के लिए, IOException मूल अपवाद है। इसके बजाय, उसे पकड़ने के लिए बेहतर है।


1
अपवाद को पकड़ना बुरा है। क्यों? downvote bad समझाया
पेड्रो सेकेरा

4

हाँ वहाँ है।

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

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...
}

मुझे उन लोगों के लिए क्या करना चाहिए जो विशिष्ट नहीं हैं ??
जोहाना

और मैं उन सभी विशिष्ट अपवादों को पकड़ लूंगा (अपवाद ई) {} ??
जोहाना
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.