क्या अपवाद एक क्रॉस-कटिंग चिंता का विषय है?


13

मुझे अपवाद हैंडलिंग और लॉगिंग की चिंताओं के बीच बहुत अंतर नहीं दिखता है, दोनों क्रॉस कटिंग चिंताएं हैं। तुम क्या सोचते हो? यह एक विधि लागू कर रहा है, जो मुख्य तर्क के साथ interleaved के बजाय अपने दम पर अलग से नियंत्रित नहीं किया जाना चाहिए?

संपादित करें : मैं जो कहना चाह रहा हूं, वह यह है कि मेरे विचार में एक विधि कार्यान्वयन में केवल निष्पादन के सफल मार्ग के लिए तर्क होना चाहिए और अपवादों को कहीं और संभाला जाना चाहिए। यह जाँच / अनियंत्रित अपवाद नहीं है।

उदाहरण के लिए, एक भाषा इस तरह से निर्माणों का उपयोग करके पूरी तरह से जांच की गई तरीके से अपवादों को संभाल सकती है:

class FileReader {

  public String readFile(String path) {
    // implement the reading logic, avoid exception handling
  }

}

handler FileReader {

   handle String readFile(String path) {
      when (IOException joe) {
        // somehow access the FileInputStram and close it
      }
   }

}

उपरोक्त वैचारिक भाषा में, प्रोग्राम FileReader हैंडलर की अनुपस्थिति में संकलित नहीं होगा , क्योंकि FileReader क्लास की रीडफाइल अपवाद को नहीं फेंक रही है। इसलिए FileReader हैंडलर की घोषणा करके , कंपाइलर यह सुनिश्चित कर सकता है कि उसे संभाला जा रहा है और प्रोग्राम फिर कंपाइल करता है।

इस तरह से हमारे पास चेक किए गए और अनियंत्रित अपवाद समस्याओं दोनों में से सबसे अच्छा है: मजबूती और पठनीयता।

जवाबों:


14

कुछ मामलों में हाँ

उन मामलों में जहां आपके पास एक अपवाद है जिसे आप लॉग इन करना चाहते हैं (जो मैं लगभग हमेशा मान सकता हूं) तो हां अपवाद एक क्रॉस कटिंग चिंता से बंधा है।

ज्यादातर समय नं

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

क्रॉस कटिंग चिंता की पहचान करना

यदि आप एक ही कोड को बार-बार डुप्लिकेट कर रहे हैं तो इसे अमूर्त करने की आवश्यकता है। यदि अमूर्तता खुद को कई परतों में बढ़ावा देती है, तो यह एक क्रॉस कटिंग चिंता का विषय हो सकता है। उसके बाद ही इस पर विचार किया जाना चाहिए।


4

लॉगिंग वैकल्पिक है। अपवादों को संभालना नहीं है।

लॉगिंग बहुत सामान्य है और जब यह विशिष्ट तर्क से स्रोत है तो यह एक सामान्य उपभोक्ता को खिलाता है। अपवाद हमेशा तर्क के लिए विशिष्ट होते हैं और उस तर्क के बारे में जानने वाले कुछ कोड को उस गड़बड़ को संभालना पड़ता है।

कम से कम मेरे दो के सीमित उपयोग में इसका मतलब है कि दो लक्ष्यों को अलग-अलग तरीकों से नियंत्रित किया जाता है न कि एक ही डिजाइन की छतरी के नीचे।


1

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


0

मुझे लगता है कि यह लीक से हटकर सार के मुद्दे से जुड़ा हुआ है।

कई अपवादों को पकड़ा जाना चाहिए और पुनर्जीवित किया जाना चाहिए क्योंकि वे अमूर्तता की परतों के माध्यम से प्रचार करते हैं। पुन: फेंकने वाले को एक नए रूप में अपवाद को फेंकना चाहिए, जो कि पुन: फेंकने वाले अमूर्त के लिए उपयुक्त है, ताकि यह इंटरफ़ेस के हिस्से के रूप में समझ में आए। दूसरे शब्दों में, अमूर्तता के निचले स्तरों से अपवादों को वर्तमान-अमूर्त रूप में अनुवादित किया जाना चाहिए ताकि उच्च स्तर के अमूर्त को निचले स्तरों के बारे में जानने की जरूरत न हो, यहां तक ​​कि विशुद्ध रूप से अपवाद संचालन के लिए भी।

हालांकि, "टपका हुआ सार का सिद्धांत" एक मुद्दा है। कुछ अपवादों को एक ऐसे रूप में अनुवाद नहीं किया जा सकता है जो अमूर्तन की अगली परत के भीतर समझ में आता है।

एक संजालित फाइलसिस्टम संबंधित अपवाद एक सरल उदाहरण है। एक नेटवर्क विफलता को "फ़ाइल" मतिहीनता के संदर्भ में व्यक्त नहीं किया जा सकता है, या यदि ऐसा होता है, तो वह अमूर्तता वास्तव में फ़ाइल हैंडलिंग के कार्यान्वयन से संबंधित सभी विवरणों को पूरी तरह से अलग नहीं करती है।

एक नेटवर्क विफलता इसलिए अंतर्निहित नेटवर्क एब्स्ट्रैक्शन से बाहर लीक होगी, और इसलिए कोड के बाकी हिस्सों के भीतर एक क्रॉस-कटिंग चिंता होनी चाहिए।

यह अपवादों के लिए अद्वितीय नहीं है, हालाँकि। फ़ाइल APIs के लिए वे सभी रिटर्न-वैल्यू एरर कोड्स जो वास्तव में फाइल एब्स्ट्रैक्शन से संबंधित नहीं हैं, लेकिन इसके बजाय हार्ड-डिस्क या नेटवर्क का विस्तार करें और जो भी विफलताएं हैं वे एक अलग रूप में एक ही चीज हैं, जो हार्ड-डिस्क विफलताओं और नेटवर्क विफलताओं का अर्थ है आदि की परवाह किए बिना क्रॉस-कटिंग चिंताएं हैं कि उन विफलताओं की रिपोर्ट कैसे की जाती है।

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