2009-03-12 13 views
6

तो, हम एक बहु-परियोजना अनुप्रयोग में हमारे अपवादों को लॉगिंग/हैंडलिंग से निपटने के लिए Enterprise Library 4.1 Exception Handling Application Block का उपयोग कर रहे हैं। हमारे पास कुछ कस्टम अपवाद हैं और कुछ अपवाद फेंक रहे हैं जिनकी कक्षाएं .NET ढांचे के मानक वर्ग पुस्तकालयों (जैसे ArgumentException, InvalidOperationException, ArgumentNullException, आदि) में परिभाषित की गई हैं।क्या आपके पास अपने कोड में .NET Framework- परिभाषित अपवाद कक्षाओं का उपयोग करने का कोई कारण नहीं है?

आज, हमारी टीम लीड ने फैसला किया कि वह नहीं चाहते थे कि हम बाद वाले का उपयोग करें, क्योंकि .NET ढांचे में उन प्रकार के अपवाद फेंक दिए जाएंगे, और एप्लिकेशन ब्लॉक की नीतियों के साथ फ़िल्टरिंग की सुविधा के लिए, हमें केवल उपयोग करना चाहिए कस्टम अपवाद हैं, अब तक के रूप में व्यावहारिक रूप से कस्टम संस्करण के साथ नेट मानक वर्ग पुस्तकालय अपवाद नकल करने, आदि के लिए जा रहा, में कस्टम ArgumentException, कस्टम InvalidOperationException रूप

मेरा प्रश्न है, क्या इस दृष्टिकोण के साथ गलत क्या है? मैं उस समय अपनी उंगली उस पर नहीं डाल सका, लेकिन यह मेरे लिए गलत गंध लगा और मैं इसके बारे में मेरी असहज भावनाओं को हिला नहीं पाया। क्या मैं ऐसी चीज के बारे में चिंतित हूं जो वास्तव में एक सौदा का बड़ा नहीं है? मुझे लगता है कि यह कुत्ते को थोड़ा सा कुत्ते की तरह महसूस करता है ...

उत्तर

12

आईक। क्या मैं इसके बारे में पसंद नहीं है यह है:

  • यह मौजूदा प्रकार डुप्लिकेट
  • यह आश्चर्य की बात है
  • कम से कम के सिद्धांत इसका मतलब है कि आप गलत तर्क मूल्य का उपयोग किया है कि अगर आप हर जगह लगाना चाहते हैं का उल्लंघन करती है (कहें) आपको ArgumentException की तलाश करने के बजाय अपवाद के दो प्रकार के पदानुक्रमों को देखना होगा।

मैं सुझाव दूंगा कि आप अपनी टीम को Effective Java 2nd edition के आइटम 60 पढ़ने के लिए नेतृत्व करें। हां, यह सी # के बजाए जावा के बारे में है - लेकिन सिद्धांत समान हैं।

+1

एलओएल - "कम से कम आश्चर्य का सिद्धांत" – Kev

+1

वह हास्यास्पद क्यों है? Http://en.wikipedia.org/wiki/Principle_of_least_astonishment –

+0

एक व्यंग्यात्मक तरीके से हंसने योग्य नहीं, बस मजाकिया, मैंने पहले कभी नहीं देखा है। – Kev

1

ठीक है, आपके कोड द्वारा फेंक दिया गया अपवाद और नेट बेस क्लास द्वारा फेंक दिया जाना चाहिए, दोनों को एक ही तरीके से संभाला जाना चाहिए।

दोनों में कोड में किसी समस्या का लक्षण हो सकता है, इसलिए न तो अनदेखा किया जाना चाहिए या फ़िल्टर किया जाना चाहिए!

4

Framework Design Guidelines पुस्तक (प्रथम संस्करण) क्रिस्टोफ़ क्वालीना और ब्रैड अब्राम द्वारा System नामस्थान में परिभाषित किया गया है, जहां आप कर सकते हैं मौजूदा अपवाद हैं, और अधिक विशिष्ट बेहतर फेंक सलाह देते हैं। यदि कोई अच्छा फिट नहीं है तो कस्टम अपवाद फेंक दें।

की एक समानांतर ब्रह्मांड कस्टमArgumentNullExceptionSystem.ArgumentNullException मैच के लिए बनाया जा रहा है प्रयास है कि मैं किसी भी मूल्य नहीं दिख रहा है की एक दोहराव अपने कोड एक रूपरेखा वर्ग आप कर सकते हैं की तुलना में एक System.ArgumentNullException फेंकता है तो बजाय है। दिन के अंत में आखिरकार जिम्मेदार स्टैक ट्रेस से निर्धारित करें।

कोड रखरखाव के समय की बात आने पर वर्तमान और भविष्य में अनावश्यक अतिरिक्त काम की यह गंध आती है।

0

फेंकना। नेट अपवाद ठीक है जब अपवाद सही तरीके से उस समस्या के प्रकार का वर्णन करता है जिसका आप खुलासा करने की कोशिश कर रहे हैं (उदाहरण के लिए जब कोई तर्क शून्य होता है तो आपको ArgumentNullException फेंकना चाहिए)। यदि आपको ऐसी स्थिति मिलती है जो .NET Framework द्वारा प्रबंधित नहीं की जाती है (उदा। आप 6 से 3 को विभाजित करना चाहते हैं लेकिन आपके एप्लिकेशन द्वारा इसकी अनुमति नहीं है) तो आपको एक कस्टम अपवाद बनाना चाहिए।

4

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

// Somewhere within a custom exception handler policy 
var frame = new StackTrace(exception).GetFrame(0); 
if (frame.GetMethod().DeclaringType.Namespace.StartsWith("MyNamespace.")) 
{ 
    // Handle exceptions from our code 
} 
else 
{ 
    // Handle framework-level exceptions 
} 
+0

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

+0

यह आपको इनलाइनिंग के साथ भी खराब करता है। विभिन्न अपवादों को फेंकना बहुत कम डोडी है। –

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

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