2015-01-24 11 views
10

को लॉगिंग और पुनर्विचार के बारे में शिकायत करने के बारे में शिकायत कर रहा है मेरे पास मेरे प्रोग्राम में कोड का निम्न भाग है और मैं इसे मैवेन के साथ एकीकृत करने के बाद कोड गुणवत्ता जांच के लिए सोनारक्यूब 5 चला रहा हूं।सोनार

हालांकि, सोनार शिकायत कर रहा है कि मुझे या तो इस अपवाद को लॉग या पुनर्स्थापित करना होना चाहिए।

मुझे यहां क्या याद आ रही है? क्या मैं पहले ही अपवाद लॉग नहीं कर रहा हूं?

private boolean authenticate(User user) { 
     boolean validUser = false; 
     int validUserCount = 0; 
     try { 
      DataSource dataSource = (DataSource) getServletContext().getAttribute("dataSource"); 
      validUserCount = new MasterDao(dataSource).getValidUserCount(user); 
     } catch (SQLException sqle) { 
      LOG.error("Exception while validating user credentials for user with username: " + user.getUsername() + " and pwd:" + user.getPwd()); 
      LOG.error(sqle.getMessage()); 
     } 
     if (validUserCount == 1) { 
      validUser = true; 
     } 
     return validUser; 
    } 
+0

शायद यह शिकायत है कि आप एक संदेश प्रवेश कर रहे हैं, लेकिन नहीं अपवाद ही है, जो आप अपवाद के संभावित रूप से उपयोगी स्टैक ट्रेस खोना पड़ता है। वैसे भी, आपको निश्चित रूप से यहां एक अपवाद फेंकना चाहिए और उपयोगकर्ता को समस्या का संकेत देना चाहिए, ऐसा करने के बजाए कि सबकुछ सामान्य रूप से चला गया और उसी चीज को वापस लौटाया जैसे उपयोगकर्ता प्रमाण-पत्र गलत थे। पासवर्ड लॉग करना निश्चित रूप से एक अच्छा विचार नहीं है: प्रमुख सुरक्षा समस्या। –

+1

आप एक कथन में एक संदेश और अपवाद लॉग नहीं कर रहे हैं। इसलिए सर्वर लॉग में दोनों संदेशों के बीच अन्य लॉग प्रविष्टियां इन दोनों संदेशों के मजबूत कनेक्शन को छिपाने के लिए हो सकती हैं। और दूसरे लॉग में मौजूद जानकारी को छिपाने वाले पहले लॉग स्टेटमेंट से एक अपवाद फेंक दिया जा सकता है। – SpaceTrucker

उत्तर

25

आप इसे इस तरह से करना चाहिए:

try { 
    DataSource dataSource = (DataSource) getServletContext().getAttribute("dataSource"); 
    validUserCount = new MasterDao(dataSource).getValidUserCount(user); 
} catch (SQLException sqle) { 
    LOG.error("Exception while validating user credentials for user with username: " + 
      user.getUsername() + " and pwd:" + user.getPwd(), sqle); 
} 

सोनार आप अब और परेशान नहीं करना चाहिए

+0

अपडेट के लिए धन्यवाद :) मैं इसे देख लूंगा। – user2325154

+1

क्या होगा अगर अपवाद java.util.concurrent.ExecutionException की तरह कुछ है और आप वास्तव में केवल कारण लॉग करना चाहते हैं। मैं विशिष्ट अपवादों को अनदेखा करने के बारे में नीचे एक टिप्पणी देखता हूं! धन्यवाद! –

+1

यह सोनार शिकायत मेरी राय में बहुत सख्त है। ऐसे अपवाद हैं जिन्हें आप पकड़ने और अनदेखा करने की उम्मीद कर सकते हैं, उदाहरण के लिए, 'FileNotFoundException' पकड़ा जा सकता है और फ़ाइल को इंगित करने वाला एक संदेश लॉग नहीं मिला था और इसके बिना निष्पादन जारी रहेगा - इस परिदृश्य के लिए किसी को भी संपूर्ण स्टैक ट्रेस की आवश्यकता नहीं है। फिर भी, // NOSONAR के साथ पकड़ लाइन को टैग करने से परे सोनार को इसके बारे में बंद करने का कोई तरीका नहीं है। –

3

आपको लगता है कि SQLException सुरक्षित रूप से अनदेखा किया जा सकता है, तो आप यह सूची में जोड़ सकते स्क्विड के लिए अपवादों का: S1166 नियम।

  1. नियम-> खोज स्क्विड: S1166 पर जाएं।
  2. गुणवत्ता प्रोफ़ाइल में अपवाद संपादित करें।
  3. सूची में SQLException जोड़ें।
+0

यह वास्तव में उपयोगी है जैसे विशेष रूप से लपेटा हुआ अपवाद जैसे java.util.concurrent.ExecutionException जहां मैं वास्तव में कारण चाहता हूं और यह अपवाद स्वयं नहीं। –

3

मैं एक ही मुद्दे पर ठोकर खाई। मैं 100% निश्चित नहीं हूं कि अगर मैं इस बिंदु पर पूरी तरह से सही हूं, लेकिन मूल रूप से आपको पूर्ण अपवाद को पुनर्स्थापित या लॉग करना चाहिए। जबकि e.getMessage() सिर्फ आपको विस्तृत संदेश देता है लेकिन निष्पादन स्टैक का स्नैपशॉट नहीं।

Oracle docs (Throwable) से:

एक फेंकने योग्य इसके बनाए जाने पर अपने धागा के निष्पादन के ढेर का एक स्नैपशॉट शामिल हैं। इसमें एक संदेश स्ट्रिंग भी हो सकती है जो त्रुटि के बारे में अधिक जानकारी देती है। समय के साथ, एक फेंकने योग्य अन्य फेंकने को प्रचारित होने से दबा सकता है। आखिरकार, फेंकने में भी एक कारण हो सकता है: एक और फेंकने योग्य जो इस फेंकने योग्य बनने का कारण बनता है। इस कारण की जानकारी की रिकॉर्डिंग को जंजीर अपवाद सुविधा के रूप में जाना जाता है, क्योंकि कारण, स्वयं का कारण हो सकता है, और इसी तरह, अपवादों की "श्रृंखला" की ओर अग्रसर होता है, प्रत्येक एक दूसरे के कारण होता है।

इसका मतलब है अबाउट कार्यों द्वारा प्रदान किया गया समाधान, क्योंकि संपूर्ण अपवाद ऑब्जेक्ट (स्क्ले) लॉगर को पास किया जा रहा है।

उम्मीद है कि यह मदद करता है। चीयर्स।

5

क्या सोनार आपको करने के लिए कह रहा है, पूरे अपवाद वस्तु को जारी रखना है। आप की तरह कुछ का उपयोग कर सकते हैं:

try { 
     ...   
    } catch (Exception e) { 
     logger.error("Error", e); 
    } 
संबंधित मुद्दे