2015-09-29 10 views
10

अपवादों के बारे में कोड के दो टुकड़े अनुयायी का उपयोग करने पर सबसे अच्छा अभ्यास है।प्रिंटिंग अपवाद बनाम अपवाद .getMessage

//code1 

} catch (SomeException e) { 
    logger.error("Noinstance available!", e.getMessage()); 
} 

//code2 
} catch (SomeException e) { 
    logger.error("Noinstance available!", e); 
} 

मुझे अपवाद के getMessage विधि का उपयोग कब करना चाहिए?

+1

लगभग हर समय। जब तक आप कुछ अपवाद और अतिसंवेदनशील टूस्ट्रिंग विधि को नहीं जानते। E.getMessage() मानक तरीका –

+2

है यदि आप केवल संदेश लॉग करते हैं, तो आपको स्टैक ट्रेस नहीं मिलता है, या नेस्टेड अपवाद होना चाहिए। अपवाद लॉग इन करें ... –

+2

@TheNeoNoir डेवलपर: "लगभग हर समय" क्या? सबसे पहला? मैं इस बारे में जानकारी खोना पसंद नहीं करता कि अपवाद कहां से आया था, इसका कारण इत्यादि। –

उत्तर

10

पहला संकलन नहीं करता है क्योंकि विधि error पहले पैरामीटर के रूप में String को स्वीकार करता है और Throwable दूसरे पैरामीटर के रूप में स्वीकार करता है।

e.getMessage()Throwable नहीं है।

कोड

} catch (SomeException e) { 
    // No stack trace 
    logger.error("Noinstance available! " + e.getMessage()); 
} 

होना चाहिए

} catch (SomeException e) { 
    // Prints message and stack trace 
    logger.error("Noinstance available!", e); 
} 

पहले प्रिंट केवल संदेश के साथ तुलना में। दूसरा प्रिंट भी पूरे स्टैक ट्रेस।

यह स्टैक ट्रेस मुद्रित करने के लिए आवश्यक है या नहीं, संदर्भ से निर्भर करता है।

यदि आप पहले ही जानते हैं कि एक अपवाद क्यों फेंक दिया जा सकता है तो पूरे स्टैक ट्रेस को प्रिंट करना एक अच्छा विचार नहीं है।

यदि आप नहीं जानते हैं, तो आसानी से त्रुटि खोजने के लिए पूरे स्ट्रैक ट्रेस को मुद्रित करना बेहतर है।

+0

मैं sl4j लॉगर और मेरा कोड 1 संकलन का उपयोग कर रहा हूं। वह – DesirePRG

+0

क्यों ठीक है, मेरी जानकारी मानक log4j के लिए थी, लेकिन शेष मान्य है –

0

Exception.printStackTrace() तब तक उपयोग नहीं किया जाना चाहिए जब तक आप उदाहरण के लिए डीबगिंग नहीं करते।

लॉगिंग के लिए, Exception.getMessage() का उपयोग करना निश्चित रूप से बेहतर है। कृपया ध्यान दें कि कई लॉगिंग फ्रेमवर्क (उदाहरण के लिए Log4j) लॉगिंग विधि (उदाहरण के लिए error()) पर एक तर्क के रूप में स्वयं को अपवाद स्वीकार करता है और इसे स्वयं ही काम करता है।

1

यह निर्भर करता है कि आपको मूल अपवाद (कुछ अपवाद) के स्टैक ट्रेस की आवश्यकता है या नहीं। यदि हां, तो कोड 2 यहां सही विकल्प है। ध्यान दें कि इन स्थितियों को संभालने का अधिक आम तरीका है।

यदि आप मूल अपवाद में रुचि नहीं रखते हैं, तो आप कोड 1 का उपयोग कर सकते हैं लेकिन यह सही नहीं है। क्योंकि आपके द्वारा भेजा गया कोड संदेश के रूप में संदेश लेता है। तो सही तरीका है:

logger.error("Noinstance available! - reason:" + e.getMessage()); 
2

इस प्रोटोटाइप उपयोगी है, जब आप व्यापार स्तर और तकनीकी अपवाद में अपवाद वर्गीकृत करते हैं।

बिजनेस लेवल अपवाद के लिए, आप एनालिटिक्स के लिए लॉग इन करके संदेश का उपयोग करते हैं या स्क्रीन पर एक अर्थ जानकारी (कुछ काम नहीं किया) प्रदर्शित करने के लिए हो सकता है।

तकनीकी अपवाद के लिए, समस्या को हल करने के लिए, स्टैकट्रैक के साथ त्रुटि को लॉग करना बेहतर है और इसे डीबग करना और हल करना आसान है।

1
स्टैकट्रेस साथ

:

logger.error("Could not do XYZ because of: " + ex, ex); 

स्टैकट्रेस के बिना:

logger.error("Could not do XYZ because of: " + ex); 
0

आप इस कोशिश कर सकते हैं: -

logger.error(e.getMessage(), e); 

यह इस फेंकने योग्य का विस्तार संदेश स्ट्रिंग देता है।

logger.error(e.getLocalizedMessage(),e); 

इस फेंकने योग्य का स्थानीय विवरण बनाता है। लोकेल-विशिष्ट संदेश बनाने के लिए सबक्लास इस विधि को ओवरराइड कर सकते हैं। उप-वर्गों के लिए जो इस विधि को ओवरराइड नहीं करते हैं, डिफ़ॉल्ट कार्यान्वयन getMessage() के समान परिणाम देता है।

अपने मामले ई में

getLocalizedMessage() यू ओवरराइड और स्थानीय संदेश के लिए अर्थ यानी अपना खुद का संदेश देने के लिए की जरूरत है, लेकिन अपवाद का उद्देश्य कुछ भी नहीं है ...।

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