यदि हम एक अपवाद संदेश लॉग करते हैं और एक अलग अपवाद फेंकते हैं, तो क्या यह अभी भी एक एंटीपैटर्न है?


18

हमारा वेबकैपेशन ExceptionMapperकुछ अपवादों को मैप करने के लिए उपयोग कर रहा है Response। हम एक नया अपवाद फेंकने से पहले अपवाद संदेश लॉग करते हैं:

catch (SomeException ex) {
  LOG.error(ex.getMessage());
  throw new MyException(ex.getMessage());
}

हम एक ही अपवाद को फिर से नहीं फेंक रहे हैं , इसलिए मेरा सवाल यह है कि क्या यह लॉग और थ्रो एंटीपैटर्न माना जाएगा । और इस प्रकार, क्या यह बेहतर होगा कि समान जगहों पर लॉगिंग को हटा दिया जाए और उन्हें ExceptionMapperनिम्नानुसार कई वर्गों में स्थानांतरित कर दिया जाए :

@Provider
public class MyExceptionMapper implements ExceptionMapper<MyException> {

  // bla bla 

  @Override
  public Response toResponse(final MyException ex) {
    LOG.error(ex.getMessage());
    return Response.status(400).entity("something").build();
  }
}

3
जैसे ही आपने लॉग इन किया मैं आपको रोक देता हूं ex.getMessage(), यह पहले से ही गलत है।
biziclop



IMO वास्तव में यह उल्लेख करना उचित नहीं है कि यह एक webservice है। यह वास्तव में खेल के नियमों को बदल देता है, क्योंकि उदाहरण के लिए केवल नियमित अपवाद हैंडलिंग मैकेनिक्स का उपयोग करना सुरक्षा जोखिम हो सकता है; आप किसी भी और सभी अपवादों को केवल 500 त्रुटि प्रतिक्रिया में वापस नहीं भेजना चाहते हैं, जिसे जांचने और फ़िल्टर करने की आवश्यकता है। आक्रामक ऑन-द-स्पॉट लॉगिंग उन प्रणालियों से निपटने के दौरान बहुत अधिक सामान्य है, जिनमें बाहरी क्लाइंट सीधे इसे लागू कर रहे हैं। बार-बार मंगवाए जाने वाले सर्विस कॉल में स्टैकट्रैग लॉग करने से असहनीय लॉग फ़ाइल आकार और प्रदर्शन समस्याएं हो सकती हैं।

@ गिम्बी इस मामले में ओपी प्रतिक्रिया में कोई त्रुटि विवरण नहीं भेजता है (शायद एक बॉयलरप्लेट "त्रुटि" सामग्री)। इसके अलावा, आप बिना किसी समस्या के निदान कैसे करते हैं? रोलिंग लॉगर्स नियमित रूप से स्टोरेज साइज का ध्यान रखते हैं और लॉग डेटा एम्बैरेसेबल कम्प्रेसेबल होता है।
मार्को टोपोलनिक

जवाबों:


36

आपका कोड वास्तव में एक नहीं, बल्कि तीन एंटीपार्टर्न खेल है:

  1. लॉग और रीथ्रो;
  2. मूल कारण को लपेटे बिना पुनर्खरीद;
  3. केवल संदेश लॉग करें और स्टैकट्रेस नहीं (यह सबसे खराब है)।

यदि आपने सबसे अच्छा अभ्यास किया है:

  1. बिल्कुल नहीं पकड़ें (अपवाद को स्वयं ही प्रचारित करें);
  2. यदि एक अपवाद को पकड़ने के लिए मजबूर किया जाता है, तो अनियंत्रित और रीथ्रो में लपेटें;
  3. शीर्ष स्तर को छोड़कर कभी भी कुछ भी लॉग न करें;
  4. पूरे अपवाद स्टैकट्रेस के साथ लॉग इन करें log.error("Error occurred", e);

तब आपको अपने वर्तमान एक सहित किसी भी दुविधा का सामना नहीं करना पड़ेगा, क्योंकि लॉग स्टैकट्रेस में सभी लिपटे अपवाद शामिल होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.