2012-09-09 32 views
6

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

मैं इस तरह कुछ करने के लिए सोच रहा हूँ:

// I'm inside an actionPerformed() method 
try { 
    // do whatever I have to do here 
} catch (KnownBusinessException1 e) { 
    // inform the user and do something; 
    // most times simply inform the user that it wasn't possible to complete the 
    // operation and remain in the same window instead of moving forward. 
} catch (KnownBusinessException2 e) { 
    // just as above 
} catch (KnownDataAccessException1 e) { 
    // just as above 
} catch (KnownDataAccessException2 e) { 
    // just as above 
} catch (RuntimeException e) { // I want to catch any other unexpected exception, 
// maybe NPE or unchecked IllegalArgumentExceptions and so on 
    // something went wrong, I don't know where nor how but I will surely inform the user 
} 

अब: कोशिश ब्लॉक में वहाँ पकड़ने के लिए अपवाद जाँच की जाती है, तो यह घोंसला करने के लिए बेहतर आज़माएं/कैच होगा या इन जाँच को पकड़ने के लिए RuntimeException पकड़ने के बाद अपवाद? (यह शायद निर्भर करता है, मुझे यह भी पता नहीं है कि यह बीटीडब्ल्यू होने वाला है या नहीं)

एक और बात: Error एस के बारे में क्या? अगर मैं उपयोगकर्ता था तो मैं एक अप्रत्याशित शटडाउन का अनुभव नहीं करना चाहूंगा, मुझे लगता है कि एप्लिकेशन मुझे बताता है कि कुछ अविश्वसनीय रूप से गलत हो गया है और कोई भी इसके बारे में कुछ नहीं कर सकता है, "दुनिया का अंत आ रहा है इसलिए मैं अभी बाहर निकल जाएगा "। कम से कम मुझे पता चलेगा कि मेरी गलती नहीं थी।

Btw अगर यह त्रुटियों को पकड़ने के लिए एक अच्छा अभ्यास है पता नहीं है ...: \

एक स्विंग आवेदन में यह करने के लिए एक बेहतर तरीका है?

+0

देखो http://stackoverflow.com/प्रश्न/352780/कब-टू-कैच-जावा-लैंग-त्रुटि –

+0

संभावित डुप्लिकेट [मैं इवेंट डिस्पैच थ्रेड (ईडीटी) अपवाद कैसे पकड़ सकता हूं?] (http://stackoverflow.com/questions/4448523/how-can -आई-कैच-इवेंट-प्रेषण-थ्रेड-एड-अपवाद) – trashgod

+0

@ बेशगुरुंग मैंने इसे पहले से ही पढ़ा था। खैर, अगर इसमें कुछ भी गलत नहीं है, तो मुझे लगता है कि मैं त्रुटियों को पकड़ने के लिए रनटाइम अप्सेप्शन कैच ब्लॉक के बाद एक और कैच ब्लॉक जोड़ूंगा और उपयोगकर्ता को बाहर निकलने से पहले सूचित करने की कोशिश करूंगा। @ trashgod: यह मेरे लिए एक डुप्लिकेट प्रतीत नहीं होता है :) – tmh

उत्तर

0

यदि प्रयास ब्लॉक में पकड़ने के लिए अपवादों की जांच की जाती है, तो क्या यह कोशिश/पकड़ने के लिए बेहतर होगा या रनटाइम अपवाद को पकड़ने के बाद इन चेक अपवादों को पकड़ना बेहतर होगा? (यह शायद निर्भर करता है, मैं भी नहीं जानता कि अगर यह btw होने जा रहा है)

वैसे ही जैसे आप ने कहा कि यह है कि क्या यह समझ में आता है की कोशिश ब्लॉक में आराम कोड निष्पादित करने के बाद अपवाद है पर निर्भर करता है पकड़ा गया यदि नहीं तो कोशिश/पकड़ ब्लॉक को घोंसला करने में कोई बात नहीं है।

0

उपयोगकर्ता को दिखाने के लिए एक अच्छा तरीका गलत है JOptionPane एस का उपयोग करना। आइकन (जानकारी/त्रुटि) के उस अच्छे उपयोग में जोड़ें और आप जाने के लिए अच्छे हैं। यहाँ आपके संदर्भ के लिए कुछ नमूना कोड:

http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

आप JOptionPane से अधिक कुछ अनुकूलन/अमूर्त कक्षाएं विचार कर सकते हैं आप के लिए :)

उसी तरह से कई अपवाद से निपटने के लिए के रूप में चाहते हैं, तो संदेश में लिखा होगा सभी 3 KnownBusinessException एस और KnownDataAccessException एस में समान होने जा रहा है, तो आप यह सुनिश्चित कर सकते हैं कि दोनों वर्गों में एक ही पैरेंटेज हो और उस वर्ग को पकड़ें। यदि KnownBusinessException एस के लिए एक ही हैंडलिंग की आवश्यकता है और KnownDataAccessException एस नहीं है, तो सभी माता-पिता के साथ सभी KnownBusinessException एस और सभी KnownDataAccessException एस समान माता-पिता के साथ हैं .. आशा है कि आप कहां से जा रहे हैं।

+0

यहां कुछ भी नया नहीं है, मुझे पता है कि जॉप्शनपेन का उपयोग कैसे करें और यदि मैं एक ही तरीके से कई अपवादों को संभालना चाहता हूं, तो मैं निश्चित रूप से कॉपी/पेस्ट नहीं करूंगा । – tmh

+1

क्षमा करें, मैंने आपके प्रश्न को गलत समझा। @Ibalazscs का जवाब 'UncaughtExceptionHandler' से जुड़ा हुआ है जो आपको चाहिए। एक आवेदन स्तर पर, आप बिना किसी शर्त के संभाल सकते हैं। मान लें कि आप इसे स्क्रीन स्तर पर करना चाहते हैं (जहां आप संभावित रूप से रनटाइम अपवाद होने की उम्मीद कर रहे हैं, आपको उन लोगों के लिए कैच जोड़ना चाहिए। उम्मीद है कि यह मदद करता है :) – javatarz

10

मुझे लगता है कि सभी चेक अपवादों को स्पष्ट रूप से पकड़ना सबसे अच्छा है, और बाकी के लिए एक अपरिचित अपवाद हैंडलर स्थापित करना है। देखें: How can I detect when an Exception's been thrown globally in Java?

यह Thread.setDefaultUncaughtExceptionHandler मैं कैसे उपयोग करते हैं:

public static void setupGlobalExceptionHandling() { 
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      handleException(e); 
     } 
    }); 
} 

ध्यान दें कि EDT थ्रेड के लिए "sun.awt.exception.handler" चाल, पदों अतः कई में उल्लेख किया है, नहीं है जरूरी है और जावा 7 में काम नहीं करता है। जावा 7 के लिए ऊपर वर्णित मानक थ्रेड.सेटडिफॉल्ट UncaughtExceptionHandler का उपयोग करें। बेशक, यदि आप अपवाद हैंडलर को पंजीकृत करने के लिए दोनों तंत्र का उपयोग करते हैं, तो कोड सभी संस्करणों में काम करेगा।

Btw, EDT धागा स्वचालित रूप से अगर न आया हुआ अपवाद फेंक दिया है पुनरारंभ (लेकिन अपने अनुप्रयोग एक असंगत स्थिति में रह सकते हैं), यह देखें: त्रुटियों के लिए इस पर EDT and runtime exception

+1

+1 'UncaughtExceptionHandler' का उल्लेख करने के लिए। यह वास्तव में आपके कोड में होना एक अच्छी बात है :) – javatarz

+0

@lbalazscs: धन्यवाद, लेकिन मुझे समझ में नहीं आया कि हैंडलएक्सप्शन (ई) क्या करना है। रनटाइम अपवादों (जैसे लॉगिंग) को संभालने का यह एक आम तरीका है? क्या होगा यदि मैं RuntimeException के विभिन्न उप-वर्गों के लिए अलग-अलग कार्रवाइयां करना चाहता हूं, इस पर निर्भर करता है कि कौन सा अपवाद फेंक दिया गया है और उस उपयोगकर्ता की कार्रवाई पर जिसने इसका कारण बनाया है? – tmh

+0

मेरे दृश्य में रनटाइम अपवाद उपयोगकर्ता क्रियाओं के कारण नहीं होते हैं लेकिन प्रोग्रामर त्रुटियों द्वारा :) एक जीयूआई में मैं अपवाद संदेश दिखा सकता हूं, संभवतः एक स्टैक ट्रेस के साथ, और मैं उपयोगकर्ता से इस जानकारी के साथ डेवलपर से संपर्क करने के लिए कहूंगा। स्विंगएक्स में जेएक्सईररपेन क्लास यह करता है। लेकिन आप अपवाद के सटीक वर्ग की जांच सहित, जो कुछ भी आप चाहें कर सकते हैं। – lbalazscs