2012-02-29 11 views
7

मैं एक अपवाद को पकड़ने के लिए चाहते हैं, यह लॉग इन करें, एक ध्वज सेट, और rethrow एक ही अपवादजावा: अपवाद rethrow नहीं कर सकते: क्रिया के अपवाद प्रकार अपवाद

मैं इस कोड है:

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
     feed.fetchContents(); 
    } catch (Exception ex) { 
     result = false; 
     Logger.info("fetching feed(%d) failed", feedId); 
     throw ex; 
    } 
    return result; 
} 

लेकिन ग्रहण पूर्व में फेंकने की शिकायत करता है, यह बताता है कि "अनचाहे अपवाद प्रकार अपवाद", और मुझे इसके चारों ओर एक कोशिश-पकड़ ब्लॉक जोड़ने का सुझाव देता है।

वास्तव में, मैं प्रक्रिया अपवाद को संभालने के लिए इस विधि बुला चाहते हैं, और इसे अपने आप को संभाल नहीं ... मैं सिर्फ सच लौटने के लिए सब कुछ ठीक हो जाता है, और लॉग यह एक अपवाद

पर हो, तो चाहते हैं दूसरी तरफ, मैं अपवाद को एक और अपवाद के अंदर लपेट सकता हूं, लेकिन मैं इसे एक ही फेंक नहीं सकता ..

कोई विचार?

public Boolean doJobWithResult() { 

:

public Boolean doJobWithResult() throws Exception { 
    // ... 
} 

उत्तर

2

मुझे लगता है कि विभिन्न बातें यहाँ उल्लेख करना हैं:

  1. आप या तो doJobWithResult() विफलता पर सफलता पर सही और गलत लौटने, या सफलता पर कुछ भी नहीं लौट सकते हैं और विफलता पर एक अपवाद फेंक करना चाहते हैं। दोनों एक ही समय में संभव नहीं है। पहले मामले में, अपवाद को पकड़ें, इसे लॉग करें और झूठी वापसी करें, दूसरे मामले में void वापस करने के लिए अपना हस्ताक्षर बदलें और अपवाद फेंक दें और कॉलर में इसे संभाल लें।
  2. यह अपवाद पकड़ने के लिए नहीं है, इसे लॉग करें और इसे फिर से करें। क्यूं कर? क्योंकि आपकी विधि के एक संभावित कॉलर को यह नहीं पता है कि आप इसे पहले ही लॉग कर रहे हैं, और इसे भी लॉग इन करें। या तो एक अपवाद फेंक दें (जिस स्थिति में कॉलर को इसका सामना करना पड़ता है) या इसे पकड़ें और इसे संभालें (इसे लॉग करें)।
  3. ध्यान दें कि Exception फेंकने से आपकी विधि के कॉलर को आपकी विधि में संभावित रूप से गलत होने के बारे में कोई संकेत नहीं मिलता है, तो यह हमेशा बेहतर अपवाद फेंकना बेहतर होता है, या उपयोगकर्ता द्वारा परिभाषित एक अपवाद को लपेटने और इसे फिर से हटाने के लिए बेहतर होता है ।
  4. इसके अलावा, अगर आप Exception फेंक, एक फोन करने वाले देख कि इससे हर RuntimeException पकड़ेगा बिना Exception पकड़ने के लिए परीक्षा हो सकती है (के बाद से अपने Exception से प्राप्त) है, जो व्यवहार वांछित नहीं किया जा सकता है।
+0

सभी उत्तरों बहुत उपयोगी थे, मुझे लगता है कि यह भी अपवादों से निपटने के तरीके के बारे में कुछ संकेत देता है ... – opensas

2

Exception के बाद से checked, को पकड़ने के लिए एक विकल्प Exception फेंक के रूप में अपने प्रणाली की घोषणा करने के लिए है

public Boolean doJobWithResult() throws Exception { 
7

आपका doJobWithResult प्रणाली की घोषणा करने के लिए है कि यह अपवाद फेंक कर सकते हैं की जरूरत है:

3

यदि doJobWithResult को अपवाद को संभालने की आवश्यकता नहीं है, तो कैच ब्लॉक को हटाएं और विधि हस्ताक्षर में "अपवाद फेंकता" जोड़ें। अपवाद लॉगिंग कक्षा/विधि में किया जा सकता है जिसे अपवाद से संबंधित प्रयास/पकड़ ब्लॉक में सौदा करना पड़ता है।

2

परिणाम को कैच ब्लॉक में गलत के रूप में सेट करने की आवश्यकता नहीं है, क्योंकि मान वापस नहीं किया जाएगा (क्योंकि हम अपवाद फेंक रहे हैं)।

आपकी विधि को यह भी घोषित करना चाहिए कि यह एक अपवाद फेंकता है और इसलिए ग्राहक को इसे संभालने के लिए मजबूर किया जाएगा।

इस विशेष मामले में एक और विशिष्ट अपवाद का उपयोग करने पर भी विचार करें।

4

यदि आप अपने विधि हस्ताक्षर में throws Exception जोड़ते हैं तो आप एक ही अपवाद फेंक सकते हैं। अन्यथा आप RuntimeException फेंक सकते हैं।

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
     feed.fetchContents(); 
    } catch (Exception ex) { 
     result = false; 
     Logger.info("fetching feed(%d) failed", feedId); 
     throw new RuntimeException(ex); 
    } 
    return result; 
} 

इस तरह के एक मामले में, आप संकेत मिलता है कि public Boolean doJobWithResult() कुछ फेंकता है, लेकिन आप इसे ठीक से बाद में संभाल के लिए सुनिश्चित करें (पकड़ या अपने धागा रोकने की उम्मीद ... यह एक RuntimeException afterall है) की जरूरत नहीं होगी।

0

आप एक अनियंत्रित अपवाद

Logger.info("fetching feed(%d) failed", feedId); 
throw new RuntimeException(ex); 
1

अपने विधि के लिए throws Exception जोड़े फेंक सकता है। आपको अपने catch ब्लॉक में result = false; जोड़ने की आवश्यकता नहीं है।

1

मुझे लगता है कि इस अपवाद को संभालने का तरीका वास्तव में उपयुक्त है अगर feed.fetchContents() विधि की कोई विफलता पुनर्प्राप्त नहीं की जा सकती है।(आइडिया जारी रखने के बजाए रोकने के लिए बेहतर है) इसके अलावा मैं आपको अधिक विशिष्ट अपवाद पदानुक्रम का उपयोग करने का सुझाव दूंगा।

और प्रभावी जावा पुस्तक से मुझे मिली एक और चीज यह है कि यदि आप इस तरह की एक विधि लिखते हैं तो आपको कारण के साथ @ थ्रो (टिप्पणियों में) के साथ दस्तावेज करना होगा।