2011-02-23 6 views
14

The javadoc exampleमैं Google Guava से Throwables.propagateIfInstanceOf() का उपयोग कैसे करूं?

try { 
    someMethodThatCouldThrowAnything(); 
    } catch (IKnowWhatToDoWithThisException e) { 
    handle(e); 
    } catch (Throwable t) { 
    Throwables.propagateIfInstanceOf(t, IOException.class); 
    Throwables.propagateIfInstanceOf(t, SQLException.class); 
    throw Throwables.propagate(t); 
    } 

बहुत ठोस नहीं है। एक असली कार्यक्रम कैसा दिखता है? मैं वास्तव में Throwables.propagateIfInstanceOf(Throwable, Class), propagate(), propagateIfPossible() विधियों के उद्देश्य को समझ नहीं पा रहा हूं। मैं उनका उपयोग कब करूं?

उत्तर

15

इन विधियों का उद्देश्य चेक अपवादों से निपटने के लिए एक सुविधाजनक तरीका प्रदान करना है।

Throwables.propagate() अनचेक किए गए चेक अपवाद को रीट्रोइंग करने के सामान्य मुहावरे के लिए एक शॉर्टेंड है (इसे विधि के throws खंड में घोषित करने से बचने के लिए)।

Throwables.propagateIfInstanceOf() चेक अपवादों को फिर से निकालने के लिए उपयोग किया जाता है जैसे कि उनके प्रकार throws विधि के खंड में घोषित किए गए हैं।

public void doSomething() 
    throws IOException, SQLException { 

    try { 
     someMethodThatCouldThrowAnything(); 
    } catch (IKnowWhatToDoWithThisException e) { 
     handle(e); 
    } catch (SQLException ex) { 
     throw ex; 
    } catch (IOException ex) { 
     throw ex; 
    } catch (Throwable t) { 
     throw new RuntimeException(t); 
    } 
} 

भी देखें:

  • Checked versus unchecked exceptions
  • दूसरे शब्दों में, सवाल

    public void doSomething() 
        throws IOException, SQLException { 
    
        try { 
         someMethodThatCouldThrowAnything(); 
        } catch (IKnowWhatToDoWithThisException e) { 
         handle(e); 
        } catch (Throwable t) { 
         Throwables.propagateIfInstanceOf(t, IOException.class); 
         Throwables.propagateIfInstanceOf(t, SQLException.class); 
         throw Throwables.propagate(t); 
        } 
    } 
    

    में कोड निम्न कोड के लिए एक आशुलिपि है The case against checked exceptions

+5

विधि आप ने लिखा के दूसरे संस्करण बराबर नहीं है ... आप दो और 'catch' ब्लॉक कि सिर्फ अपवाद rethrow ...' RuntimeException' के लिए और एक के लिए जोड़ने की जरूरत होगी ' Error'। 'Throwables.propagate' केवल 'RuntimeException' में फेंकने योग्य लपेटता है यदि यह पहले से ही एक अनचेक अपवाद नहीं है। – ColinD

+0

मैं अभी भी अनदेखा नहीं करता हूं। अगर मैं इसे प्रचारित करना चाहता हूं तो मैं अपवाद क्यों पकड़ना चाहता हूं? मैं कर सकता हूं: सार्वजनिक शून्य कुछ कुछ() IOException फेंकता है, SQLException {कोशिश करें {someMethodThatCouldThrowAnything(); } पकड़ो (IKnowWhatToDoWithThisException ई) {हैंडल (ई); }}। यह एक असली उदाहरण नहीं है ... –

+1

@ जेनी: आप ऐसा नहीं कर सकते हैं 'कुछ विधि' थॉटकॉथ थ्रो कुछ() ''IOException' और' SQLException' के अलावा कुछ चेक अपवाद फेंक सकता है। – axtavt

2

मैं गुवा थ्रोबल्स के दस्तावेज़ीकरण से गुजर चुका हूं और मैंने उन्हें वास्तव में उपयोगी नहीं पाया है। थ्रोबेल.प्रोपैगेट() से फेंकने के लिए नया रनटाइम अपवाद (ई) का उपयोग करना परिदृश्य में है जहां आप एक अनचाहे अपवाद को एक अपवाद अपवाद लपेटना चाहते हैं।

+0

आपको यह भी जांचना नहीं है कि आपका फेंकने योग्य एक विशिष्ट चेक अपवाद है, रनटाइम एक या त्रुटि है। यह बहुत अधिक फेंकने योग्य encapsulation के लिए रोकता है। लपेटा हुआ RuntimeException के किलोमीटर को देखना असामान्य नहीं है जो जाने के लिए बहुत लंबे स्टैक निशान की ओर जाता है। और अंत में देखें कि केवल अंतिम मूल्य है। – LoganMzz

0

एक परिदृश्य मैं किसी भी व्यक्ति को प्रदान कर सकता हूं जो यह उपयोगी पाएगा यदि आपके पास किसी अपवाद को फेंकने का कोई तरीका है, तो इसका उपयोग विशिष्ट अपवाद में कारण को अनचाहे/डालने के लिए किया जा सकता है।

उदाहरण: अमरूद के LoadingCache में get विधि सभी ExecutionException में अपवाद जाँच गिर्द घूमती है। प्रलेखन में कहा गया है कि अपवाद का निरीक्षण getCause() का उपयोग करके किया जा सकता है।

यहाँ Throwables.propagateIfInstanceOf बुला विधि संभाल करने के लिए, विशिष्ट अपवाद फेंक अगर हम जानते हैं कि cache.get() उन अपवादों (शायद LoadingCache के लिए विशिष्ट फेंक होगा इस्तेमाल किया जा सकता है, लेकिन अगर मूल्य misisng है, कैश जो कर सकते हैं एक मूल्य लोड करने के लिए कोशिश करता है चेक अपवाद फेंक दें)।

public String getCacheValue(String key) throws SQLException{ 
    try{ 
     return cache.get(key); 
    }catch(ExecutedException ex){ 
     Throwables.propagateIfInstanceOf(ex.getCause(), SQLException.class); 
     Throwables.propagate(ex); 
    } 
}