2011-10-03 18 views
14

में बेहतर अपवाद हैंडलिंग मैंने अपनी संस्थाओं को बनाए रखने पर ईजेबी 3/जेपीए का उपयोग किया और मुझे खुशी है कि यह मेरे डीबी से संबंधित कार्य को प्रबंधित करने में सक्षम है। मेरी एकमात्र चिंता अपवाद हैंडलिंग पर है। इकाई को सहेजते समय मेरा नमूना कोड हमेशा इस स्वाद में आता है। नेट पर पढ़ने वाले अधिकांश ट्यूटोरियल अपवाद हैंडलिंग के संबंध में इस स्वाद में भी आते हैं।जेपीए

@Stateless 
public class StudentFacade{ 
    @PersistenceContext(unitName = "MyDBPU") 
    private EntityManager em; 

    public void save(Student student) { 
     em.persist(student); 
    } 
} 

लेकिन मुझे नहीं पता कि ईजेबी ऐप में अपवाद हैंडलिंग का सबसे अच्छा तरीका क्या है? अपवाद को संभालने का सबसे अच्छा तरीका क्या होना चाहिए?

क्या यह अपवाद को संभालने वाला है? अपने सत्र मुखौटा पर एक कोशिश पकड़ ब्लॉक?

@Stateless 
public class StudentFacade{ 
    @PersistenceContext(unitName = "MyDBPU") 
    private EntityManager em; 

    public void save(Student student) { 
     try { 
      em.persist(student); 
     } catch(Exception e) { 
      //log it or do something 
     } 
    } 
} 

या विधि को अपवाद फेंकने दें?

public void save(Student student) throws Exception { 
    em.persist(student); 
} 

मुझे नहीं पता कि मेरी समझ सही है क्योंकि मैं अभी भी ईजेबी सीख रहा हूं। धन्यवाद

+0

यदि आप अपवाद फेंक रहे हैं, तो आप इसे –

उत्तर

10

अपवाद हैंडलिंग का विचार किसी भी विफलता के मामले में एक बिंदु पर कुछ तर्क कर रहा है। कोशिश पकड़ अंतिम बिंदु जहां अपवाद को संभालने की ज़रूरत पर इस्तेमाल किया जाएगा या आप भी बनी रहती है

प्रतिनिधि अपवाद है, एक और अपवाद

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

//This is in Facade Layer 
public void save(Student student) throws AppException{ 
    //exceptions delegated to action layer 

    //call to Persist Layer 
} 

अनुप्रयोग अपवाद कहने के लिए जनरल अपवाद परिवर्तित हठ में आप हो और SqlException तरह DBException।यह अपवाद जैसे कार्रवाई या फसाड परत को नहीं भेज दिया जाना चाहिए, इसलिए हम विशेष रूप से अपवाद को पकड़ने और फिर आप पकड़ेगा कोई नया अपवाद (आवेदन के लिए एक उपयोगकर्ता परिभाषित अपवाद) कार्रवाई परत में

//This is in Persist Layer 
public void save(Student student) throws AppException{ 
     //converting general exception to AppException and delegating to Facade Layer 

     try{ 
      em.persist(student);//call to DB. This is in Persist Layer 
     }catch(Exception e){ 
      throw new AppException("DB exception", e) 
     } 
    } 

फेंक कार्रवाई में अपने अपवाद और फिर वहाँ

//This is in Action layer 
    public void callSave(Student student){ 
      try{ 
       //call Facade layer 
      }catch(AppException e){ 
       //Log error and handle 
      } 
    } 
+3

हठ हैं पकड़ने के लिए की जरूरत नहीं है परत एक ईजेबी है तो आपका दृष्टिकोण काम नहीं करता है क्योंकि विधि लौटने के बाद, कई अपवाद होते हैं। – Lii

3

यदि आप चाहते हैं कि अपवाद फेंकने की विधि em.persistance (...) से प्राप्त हो, तो उस कथन को उस कोशिश/पकड़ ब्लॉक के साथ न घुमाएं (कारण उस ब्लॉक में हर अपवाद को पकड़ लेगा)।

जिस तरह से आप इस समस्या से संपर्क करते हैं, एप्लिकेशन पर निर्भर करता है, चाहे पहले से ही कुछ विरासत कोड मौजूद है या नहीं। मामले में विरासत कोड है, मेरा सुझाव है कि आप स्थिरता बनाए रखने के लिए एक ही दृष्टिकोण का उपयोग करें (यहां तक ​​कि कुछ मामलों में यह गति अनुकूल नहीं है)।

अन्यथा मैं अंगूठे के नियमों के निम्नलिखित अपवादों का सुझाव दूंगा - उनका इलाज पहले स्थान पर किया जाना चाहिए जहां आपके पास एक कार्रवाई करने के लिए आवश्यक सभी जानकारी है, अन्यथा उन्हें फेंक दें ताकि कोई और संभाल सके। (यदि आप उन्हें फेंक देते हैं तो सुनिश्चित करें कि आप उस विशिष्ट अपवाद को फेंक दें जो आप फेंक सकते हैं (सामान्य अपवाद नहीं))। जेपीए का उपयोग करते समय अपवादों को संभालना सामान्य रूप से जावा अपवादों को संभालने से अलग नहीं होता है।

मुझे आशा है कि यह "धार्मिक बातचीत" शुरू किए बिना अपवादों के बारे में पर्याप्त जानकारी थी।

0

अपवाद संभाल अपने संयोजन जेपीए साथ EJB है, तो सभी जेपीए अपवाद क्रम अपवाद हैं।

EJB हैंडलिंग अपवाद 1) आवेदन अपवाद 2) सिस्टम अपवाद

आवेदन अपवाद अपवाद मूल रूप से हम व्यापार सत्यापन और व्यापार के नियम का उपयोग कर रहे जाँच के 2 प्रकार।

सिस्टम अपवाद रनटाइम अपवाद हैं, ताकि अगर कोई रनटाइम उत्साह ईजेबी कंटेनर खुश हो जाए तो रनटाइम अपवाद को रिमोट अपवाद के रूप में हस्तक्षेप और परिवर्तित कर देगा।

पूर्व के लिए: दाव परत

public void store(Cargo cargo) { 
    entityManager.persist(cargo); 
} 

में सभी जेपीए अपवाद क्रम अपवाद ही कर रहे हैं।

EJB सेवा परत में

:

public TrackingId bookNewCargo(UnLocode originUnLocode, 
     UnLocode destinationUnLocode, 
     Date arrivalDeadline) { 

    Cargo cargo = new Cargo(trackingId, routeSpecification); 
    cargoRepository.store(cargo); 
    return cargo.getTrackingId(); 
} 
EJB परत यदि कोई क्रम अपवाद happend, EJB कंटेनर हस्तक्षेप और दूरदराज के अपवाद में बदल जाएगा में

इंटरफेस परत में:

तो

कि इस जेपीए तरह -> EJB -> इंटरफ़ेस