2012-01-10 9 views
7

में सिग्नेक्टिक चीनी की कोशिश करें। मुझे आश्चर्य है कि अगर जावा (शुद्ध कोड, कुछ ग्रहण वस्तु नहीं) में "सिंटैक्टिक चीनी" को दोहराया जाने वाला प्रयास करने का प्रयास करें तो दोबारा प्रयास करें। अर्थात्, मुझे कार्यों का एक गुच्छाजावा

public void foo(){ 
    try{ 
     // bla 
    } catch (Exception e) { 
      System.out.println("caught exception:"); 
      e.printStackTrace(); 
    } 
} 

public void bar(){ 
    try{ 
     // other bla 
    } catch (Exception e) { 
      System.out.println("caught exception:"); 
      e.printStackTrace(); 
    } 
} 

और इसी तरह से लपेटना है। मैं

@excepted public void foo(){ 
// bla 
} 

@excepted public void bar(){ 
// other bla 
} 

मुझे लगता है कि इस प्रकार की चीनी पाइथन में संभव थी। क्या जावा में यह संभव है?

+3

पकड़ना और स्टडआउट के लिए अपवाद को छोड़ना आम तौर पर एक खराब विचार है। इसके बजाए, या तो * अपवाद को पकड़ें (कोड को कॉल करने के लिए छोड़कर) या इसे उचित के रूप में संभाल लें। "इसे उचित रूप से संभालने" के लिए कोई वास्तविक अमूर्तता उपलब्ध नहीं है क्योंकि यह "ब्लै" की सामग्री के आधार पर भिन्न होती है। –

+0

यदि आप बिना किसी अपवाद को संभालने के लिए विशिष्ट कुछ भी करने जा रहे हैं, तो आप पूरे प्रोग्राम को एक ही कोशिश/पकड़ – Matthew

+0

में लपेट सकते हैं, सामान्य 'अपवाद' को पकड़ना आम तौर पर एक खराब विचार है, जब तक कि आप ढांचे को लिख नहीं लेते कुछ प्रकार का कोड। –

उत्तर

4

अपने स्यूडोकोड तरह एनोटेशन के साथ चलता है तुम कुछ नहीं कर सकते, लेकिन आप विधि (रों) फेंक कर सकते हैं:

public void bar() throws Exception {} 

और बस यह बबल सामने सभी तरह करते हैं, यह पकड़ने जहां भी आप चाहते कॉल कॉल पेड़ को ऊपर (या कॉल स्टैक के नीचे, यदि आप चाहें)।

+1

मैं इसे एक +1 * अगर * यह 'अपवाद' फेंक नहीं रहा था, बल्कि, अधिक विशिष्ट प्रकार के अपवादों को फेंक रहा था। मुझे एहसास है कि ओपी का सवाल 'अपवाद' से निपटा है, लेकिन मुझे नहीं लगता कि हमें इसे प्रोत्साहित करना चाहिए। गरीब चैप के बारे में सोचें जिसे इस इंटरफ़ेस को कोड करना है। एस/उसे अब भी एक सामान्य 'अपवाद' पकड़ने और संभालने के लिए मिला है। –

+0

रिकॉर्ड के लिए, मैं इसके साथ सहमत नहीं हूं; मैं विशिष्ट प्रकार के 'अपवाद' को भी पसंद करता हूं, अगर उन्हें फेंकने के लिए घोषित किया जाना चाहिए। हमारे सभी अपवाद 'रनटाइम अपवाद' हैं, इसलिए घोषणा करने की कोई आवश्यकता नहीं है (लेकिन उन्हें एपीआई के लिए दस्तावेज किया जाना चाहिए !!!) – sarumont

+0

वैसे, निजी तरीकों को 'अपवाद फेंकता' के रूप में घोषित करना, बिल्कुल सही नहीं, बुरा नहीं लगता मेरे लिए। – gpeche

1

आपके प्रश्न के पहले भाग के लिए, जावा 7 में दोहराव अपवाद को पकड़ने के लिए नई वाक्य रचनात्मक चीनी है, इस article पर एक नज़र डालें।

आपके प्रश्न के दूसरे भाग के लिए, मुझे डर है कि जावा में ऐसी कोई चीज़ नहीं है।

2

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

वास्तविक उपयोग केस के आधार पर आप एओपी/बाइटकोड गेम भी चला सकते हैं।

1

मेरा सुझाव या तो आपको throws Exception के साथ विधियों की घोषणा या उन्हें RuntimeExceptions के रूप में पकड़ें और उन्हें फिर से निकालें।

बस Exceptions को पकड़ना और प्रिंट करना प्रैटिस में एक बुरा विचार है क्योंकि आप Exception से पुनर्प्राप्त करने के लिए कुछ भी करने के बावजूद निष्पादित करना जारी रखते हैं। अपने कोड ठीक से चलाने के लिए जारी है यहां तक ​​कि अगर, जल्द ही आपको एक लॉग अपवाद के सैकड़ों से भरा फ़ाइल होगा और यह डिबगिंग और में उपयोगी जानकारी पाने के लिए लगभग बेकार हो जाएगा।

try { 
    ... 
} catch (Exception e) { 
    System.out.println("caught exception:"); 
    e.printStackTrace(); 
} 
0

इस उत्तर के लिए, मैं मान लेंगे कि

  1. आपको अपवादों को फेंकने वाले गैर-अंतिम तरीकों के पूरे समूह के साथ क्लास बेस दिया जाता है।
  2. आपको कक्षा तैयार करना है जो आधार को बढ़ाता है लेकिन उन्हें फेंकने के बजाय अपवादों को लॉग करने के लिए कुछ विधियों के व्यवहार को बदलता है।
  3. आपके पास बेस के स्रोत कोड तक पहुंच है और संशोधन कर सकते हैं।

आप एक एनोटेशन प्रोसेसर लिख सकते हैं। बेस क्लास पर एक एनोटेशन डालें जो प्रोसेसर को एक्सटेंशन क्लास बनाने के लिए कहता है। फिर कुछ तरीकों से, एनोटेशन को प्रोसेसर को फेंकने के बजाय अपवाद लॉग करने के लिए कहें।

यह आपकी परिस्थितियों के आधार पर सहेजने से अधिक काम (प्रोसेसर लिखना और डिबग करना) हो सकता है।

आप InvocationHandler लिखकर और Proxy लिखकर वांछित परिणाम प्राप्त करने में भी सक्षम हो सकते हैं।