में इस और अधिक हाल के प्रश्न मैं मुद्दा यह है कि अपवाद बिल्कुल संदेश शामिल नहीं होना चाहिए बनाया है। मेरी राय में, वे जो करते हैं वह एक बहुत बड़ी गलत धारणा है। मैं जो प्रस्ताव कर रहा हूं, वह है
अपवाद का "संदेश" अपवाद का (पूरी तरह से योग्य) वर्ग नाम है।
एक अपवाद को अपने स्वयं के सदस्य चर के भीतर होना चाहिए, जैसा कि वास्तव में हुआ था; उदाहरण के लिए, एक IndexOutOfRangeException
अनुक्रमणिका मान होना चाहिए जो अमान्य पाया गया था, साथ ही साथ ऊपरी और निचले मान जो इस समय मान्य थे कि अपवाद फेंक दिया गया था। इस तरह, प्रतिबिंब का उपयोग करने से आपके पास एक संदेश स्वतः निर्मित हो सकता है जो इस तरह से पढ़ता है: IndexOutOfRangeException: index = -1; min=0; max=5
और यह, स्टैक ट्रेस के साथ, सभी उद्देश्यपूर्ण जानकारी होनी चाहिए जो आपको समस्या का निवारण करने के लिए चाहिए। इसे एक सुंदर संदेश में बदलना जैसे "इंडेक्स -1 0 और 5 के बीच नहीं था" कोई मूल्य नहीं जोड़ता है।
आपके विशेष उदाहरण में, NodePropertyNotFoundException
वर्ग में उस संपत्ति का नाम होगा जो नहीं मिली थी, और नोड के लिए एक संदर्भ जिसमें संपत्ति नहीं थी। यह महत्वपूर्ण है: इसमें नोड का नाम नहीं होना चाहिए ; इसमें वास्तविक नोड का संदर्भ होना चाहिए। आपके विशेष मामले में यह आवश्यक नहीं हो सकता है, लेकिन यह सिद्धांत का मामला है और सोचने का एक पसंदीदा तरीका है: अपवाद का निर्माण करते समय प्राथमिक चिंता यह है कि यह कोड द्वारा उपयोग करने योग्य होना चाहिए जो इसे पकड़ सकता है। मनुष्यों द्वारा उपयोगिता एक महत्वपूर्ण, लेकिन केवल माध्यमिक चिंता है।
यह बहुत ही निराशाजनक स्थिति का ख्याल रखता है जो आपने अपने करियर के किसी समय में देखी होगी, जहाँ आपने संदेश पाठ के भीतर क्या हुआ, इसके बारे में महत्वपूर्ण जानकारी वाला एक अपवाद पकड़ा हो सकता है, लेकिन इसके सदस्य चर में नहीं, इसलिए आप क्या हुआ, यह जानने के लिए कि पाठ संदेश अंतर्निहित परत के भविष्य के संस्करणों में समान रहेगा, और यह प्रार्थना करते हुए कि संदेश पाठ कुछ विदेशी भाषा में नहीं होगा, जब आपका कार्यक्रम हो दूसरे देशों में चलते हैं।
बेशक, चूंकि अपवाद का वर्ग नाम अपवाद का संदेश है, (और अपवाद के सदस्य चर विशिष्ट विवरण हैं), इसका मतलब है कि आपको सभी अलग-अलग संदेशों को व्यक्त करने के लिए बहुत सारे और बहुत सारे अपवादों की आवश्यकता है, और यह ठीक है।
अब, कभी-कभी, जैसा कि हम कोड लिखते हैं, हम एक गलत स्थिति में आ जाते हैं, जिसके लिए हम बस एक throw
स्टेटमेंट को जल्दी से कोड करना चाहते हैं और अपने कोड को लिखने के लिए आगे बढ़ने के बजाय हम एक नया अपवाद वर्ग बनाने के लिए क्या कर रहे हैं ताकि हम कर सकें इसे वहीं फेंक दो। इन मामलों के लिए, मेरे पास एक GenericException
वर्ग है जो वास्तव में एक निर्माण-समय पैरामीटर के रूप में एक स्ट्रिंग संदेश को स्वीकार करता है, लेकिन इस अपवाद वर्ग के निर्माता को एक बड़ी बड़ी उज्ज्वल बैंगनी FIXME XXX TODO
टिप्पणी के साथ सुशोभित किया गया है, जिसमें कहा गया है कि इस वर्ग की हर एक तात्कालिकता होनी चाहिए सॉफ़्टवेयर सिस्टम जारी होने से पहले कुछ और विशेष अपवाद वर्ग के एक पल के साथ प्रतिस्थापित किया जाता है, अधिमानतः कोड होने से पहले।