2010-02-27 16 views
8

मैं एक java.util.Iterator अंदर एक java.sql.RecordSet लपेटकर कर रहा हूँ। मेरा सवाल यह है कि, यदि किसी रिकॉर्डसेट विधि में SQLException फेंकता है तो मुझे क्या करना चाहिए?कैसे जांचे हुए अपवादों के साथ कार्यान्वयन सौदा iterator चाहिए?

java.util.Iterator javadoc बताते हैं जो अपवाद विभिन्न परिस्थितियों में (यानी NoSuchElementException मामले आप अगले() पिछले तत्व से परे फोन में) फेंक

हालांकि, यह जब वहाँ एक पूरी तरह से असंबंधित समस्या यह है कि क्या करना है का उल्लेख नहीं करता उदाहरण के कारण नेटवर्क या डिस्क आईओ समस्याएं। क्योंकि यह इटरेटर इंटरफेस के साथ असंगत है

अगले() और hasNext() में, बस फेंक SQLException संभव नहीं है।

public class MyRecordIterator implements Iterator<Record> 
{ 
    private final ResultSet rs; 

    public MyRecordIterator() throws SQLException 
    { 
     rs = getConnection().createStatement().executeQuery(
       "SELECT * FROM table");   
    } 

    @Override 
    public boolean hasNext() 
    { 
     try 
     { 
      return !rs.isAfterLast(); 
     } 
     catch (SQLException e) 
     { 
      // ignore, hasNext() can't throw SQLException 
     } 
    } 

    @Override 
    public Record next() 
    { 
     try 
     { 
      if (rs.isAfterLast()) throw new NoSuchElementException(); 
      rs.next(); 
      Record result = new Record (rs.getString("column 1"), rs.getString("column 2"))); 
      return result; 
     } 
     catch (SQLException e) 
     { 
      // ignore, next() can't throw SQLException 
     } 
    } 

    @Override 
    public void remove() 
    { 
     throw new UnsupportedOperationException("Iterator is read-only"); 
    } 
} 

उत्तर

11

मैं एक अनियंत्रित अपवाद में जाँच अपवाद लपेट होता है, की अनुमति देता है यह इटरेटर को तोड़ने के बिना फेंक दिया करने के लिए:

यहाँ मेरे वर्तमान कोड (सरलीकृत) है।

मैं कंट्रोलर (स्ट्रिंग, थ्रोबल) को कार्यान्वित करने, RuntimeException को विस्तारित करने वाले एक एप्लिकेशन विशिष्ट अपवाद का सुझाव देता हूं ताकि आप कारण तक पहुंच बनाए रख सकें।

उदाहरण के लिए।

@Override 
    public boolean hasNext() { 
     try { 
     return !rs.isAfterLast(); 
     } catch (SQLException e) { 
     throw new MyApplicationException("There was an error", e); 
     } 
    } 

अद्यतन: अधिक जानकारी के लिए की तलाश में आरंभ करने के लिए Googling कोशिश 'को चेक अनियंत्रित जावा SqlException'। काफी IBM Developerworks पर कुछ अलग दृष्टिकोण के साथ बनाम 'Best Practises for Exception Handling' on onjava.com पर अनियंत्रित अपवाद हैंडलिंग और चर्चा जाँच की की विस्तृत चर्चा।

+0

अच्छा विचार है। आप किस अपवाद की सिफारिश करते हैं? क्या इसके लिए एक स्वीकार्य अभ्यास है? – amarillion

+1

उम्मीद है कि मदद करता है - यदि आप इसे उपयुक्त महसूस करते हैं, तो आप मौजूदा रनटाइम अपवाद जैसे कि अवैध महसूस करते हैं, मुझे संदेह है कि आप अपना स्वयं का अपवाद सबक्लास बनाना चाहते हैं यदि आप इसे आगे संसाधित करना चाहते हैं और अपवाद को अपने आवेदन के संदर्भ में सार्थक बनाना चाहते हैं । – Brabster

+0

कोड कई iterators हैं, तो यह banishing में खत्म हो सकता है अपवाद जाँच की। यह जावा कोने डिजाइन द्वारा टूटा हुआ प्रतीत होता है। – ceving

संबंधित मुद्दे