2012-04-18 17 views
7

कोई आमंत्रण TargetException के लक्ष्य अपवाद को फिर से कैसे फेंकता है। मेरे पास एक तरीका है जो मेरी कक्षाओं में से किसी एक के भीतर invoke() विधि को कॉल करने के लिए प्रतिबिंब का उपयोग करता है। हालांकि, अगर मेरे कोड में एक अपवाद फेंक दिया गया है, तो मैं InvocationTargetException के बारे में चिंतित नहीं हूं और केवल लक्ष्य अपवाद चाहता हूं। यहां एक उदाहरण दिया गया है:एक InvocationTargetException लक्ष्य अपवाद को दोबारा फेंक दें

public static Object executeViewComponent(String name, Component c, 
     HttpServletRequest request) throws Exception { 

    try { 
     return c.getClass() 
       .getMethod(c.getMetaData().getMethod(), HttpServletRequest.class) 
       .invoke(c, request); 
    } catch (InvocationTargetException e) { 
     // throw the target exception here 
    } 
} 

प्राथमिक समस्या का सामना करना पड़ रहा है यह है कि कॉलिंग e.getCause(); एक अपवाद नहीं फेंकता है बल्कि एक थ्रोबल फेंकता है। शायद मैं इस गलत तरीके से आ रहा हूं?

catch (XXXException e) 
{ 
     throw e; 
} 

उत्तर

12
catch (InvocationTargetException e) { 
    if (e.getCause() instanceof Exception) { 
     throw (Exception) e.getCause(); 
    } 
    else { 
     // decide what you want to do. The cause is probably an error, or it's null. 
    } 
} 
+0

+1। –

+0

आपके आमंत्रण लक्ष्यीकरण अपवाद के लिए 'शून्य' कारण कैसे हो सकता है? –

+0

मुझे नहीं लगता कि यह कभी भी कारण होगा जब यह अपवाद Method.invoke() द्वारा फेंक दिया गया है, लेकिन InvocationTargetException में एक निर्माता है जो शून्य लक्ष्य को अनुमति देता है, इसलिए अन्य परिस्थितियों में, यह शून्य हो सकता है। मैं निश्चित रूप से नहीं जानता, Method.invoke API दस्तावेज़ से, अगर किसी त्रुटि को आमंत्रण के अंदर लपेटा गया है तो लक्ष्य के रूप में फेंक दिया गया है। –

0

आप किसी भी अपवाद आप फेंक कीवर्ड और इसी वस्तु आप पकड़ा का उपयोग करके पहले पकड़ा rethrow कर सकते हैं। यदि आप संकलक को लगता है कि आप Exception फेंक रहे हैं तो आपको शायद इसे कास्ट करने की आवश्यकता है।

throw (Exception) e.getCause(); 
+0

ओपी InvocationTargetException –

+0

का कारण चाहता है यह सिर्फ वही अपवाद फेंकता है। मैं InvocationTargetException "खाने" चाहता हूं और केवल लक्ष्य अपवाद फेंकना चाहता हूं। –

+0

तो आपको करना होगा: फेंकना (अपवाद) e.getCause(); (जैसे टिम बेंडर ने कहा) टाइपिंग में जोड़ने के लिए – Stephan

2

Exception#getCause रिटर्न एक Throwable:

-1

आप यह स्पष्ट रूप से घोषित करने के बिना कारण rethrow कर सकते हैं।

public static Object executeViewComponent(String name, Component c, 
     HttpServletRequest request) throw /* known exceptions */ { 

    try { 
     return c.getClass() 
       .getMethod(c.getMetaData().getMethod(), HttpServletRequest.class) 
       .invoke(c, request); 
    } catch (InvocationTargetException e) { 
     // rethrow any exception. 
     Thread.currentThread().stop(e.getCause()); 
    } 
} 
+0

यह काम करता है, लेकिन यह खतरनाक है। एक अच्छे कारण के लिए रोकें() विधि को हटा दिया गया है। यह स्टॉप() एपीआई दस्तावेज़ों से है: बहिष्कृत यह विधि स्वाभाविक रूप से असुरक्षित है। विवरण के लिए रोकें() देखें। इस विधि का एक अतिरिक्त खतरा यह है कि इसका उपयोग अपवाद उत्पन्न करने के लिए किया जा सकता है कि लक्ष्य धागा को संभालने के लिए तैयार नहीं किया गया है (चेक अपवादों सहित थ्रेड संभवतः फेंक नहीं सकता था, यह इस विधि के लिए नहीं था)। अधिक जानकारी के लिए, देखें थ्रेड.स्टॉप, थ्रेड.suspend और Thread.resume क्यों अस्वीकृत हैं? – dgt

0

नीचे वर्बोज़ है, लेकिन मुझे प्रतिबिंब और कास्टिंग से बचना पसंद है। मुझे नहीं लगता (लेकिन मुझे यकीन नहीं है) कि जावा 7 का मल्टी कैच सिंटैक्स उपयोगी होगा।

public static Object executeViewComponent(String name, Component c, 
     HttpServletRequest request) throw KnownException_1 , KnownException_2 , ... , KnownException_n { 

    try { 
     return c.getClass() 
       .getMethod(c.getMetaData().getMethod(), HttpServletRequest.class) 
       .invoke(c, request); 
    } 
    catch (InvocationTargetException cause) 
    { 
      assert cause . getCause () != null : "Null Cause" ; 
      try 
      { 
       throw cause . getCause () ; 
      } 
      catch (KnownException_1 c) 
      { 
       throw c 
      } 
      catch (KnownException_2 c) 
      { 
       throw c 
      } 
      ... 
      catch (KnownException_n c) 
      { 
       throw c 
      } 
      catch (RuntimeException c) 
      { 
       throw c ; 
      } 
      catch (Error c) 
      { 
       throw c ; 
      } 
      catch (Throwable c) 
      { 
       assert false : "Unknown Cause" ; 
      } 
    } 
} 
संबंधित मुद्दे