मुझे नहीं पता कि कोई सिद्धांत है या नहीं, लेकिन एक उभरता हुआ प्रायोगिक विज्ञान हो सकता है।
सबसे अच्छा स्रोत जो मैं सोच सकता हूं वह है ब्रेज़न स्ट्रॉस्ट्रुप, द डिज़ाइन एंड एवोल्यूशन ऑफ़ सी ++, एडिसन-वेस्ले, 1994 । अगर मुझे सही तरीके से याद है (यह एक बहुत अच्छी किताब है और लोग मुझसे इसे उधार लेते हैं और इसे वापस नहीं करते हैं, तो मेरे पास इस समय कॉपी नहीं है) अपवादों के बारे में एक अध्याय है। स्ट्रॉस्ट्रप के तहत C ++ समिति को बहुत अधिक अनुभवजन्य साक्ष्य की आवश्यकता थी जो कि भाषा की परिभाषा में जोड़ने के लिए तैयार होने से पहले एक प्रस्तावित विशेषता आवश्यक थी। अपवाद के बारे में विकिपीडिया पृष्ठ है कि पुस्तक से निम्नलिखित उद्धरण है:
नवंबर 1991 में पालो अल्टो [C ++ मानकीकरण] बैठक में, हमने जिम मिशेल (पूर्व में जेरॉक्स PARC से) से व्यक्तिगत अनुभव और डेटा दोनों के साथ समाप्ति शब्दार्थ के लिए तर्कों का एक शानदार सारांश सुना। जिम ने 20 वर्षों की अवधि में आधा दर्जन भाषाओं में अपवाद हैंडलिंग का उपयोग किया था और ज़ेरॉक्स के सेडर / मेसा सिस्टम के मुख्य डिजाइनरों और कार्यान्वयनकर्ताओं में से एक के रूप में फिर से शुरू होने वाले शब्दार्थ का एक प्रारंभिक प्रस्तावक था। उनके संदेश को समाप्त कर दिया गया था, फिर से शुरू करने पर पसंद किया जाता है; यह विचार का विषय नहीं है बल्कि वर्षों के अनुभव का विषय है। फिर से शुरू करना आकर्षक है, लेकिन वैध नहीं है। उन्होंने कई ऑपरेटिंग सिस्टम के अनुभव के साथ इस कथन का समर्थन किया। प्रमुख उदाहरण देवदार / मेसा था: यह उन लोगों द्वारा लिखा गया था, जिन्हें पसंद और फिर से शुरू किया गया था, लेकिन उपयोग के दस साल बाद, आधी मिलियन लाइन प्रणाली में फिर से शुरू होने का केवल एक उपयोग था - और वह एक संदर्भ जांच थी। क्योंकि इस तरह की संदर्भ जांच के लिए फिर से शुरू करना आवश्यक नहीं था, उन्होंने इसे हटा दिया और सिस्टम के उस हिस्से में एक महत्वपूर्ण गति में वृद्धि देखी। प्रत्येक मामले में जहां बहाली का उपयोग किया गया था - दस वर्षों में - एक समस्या बन गई थी और एक अधिक उपयुक्त डिजाइन ने इसे बदल दिया था। मूल रूप से, पुनरारंभ के प्रत्येक उपयोग ने अमूर्तता के अलग स्तर को रखने में विफलता का प्रतिनिधित्व किया था। प्रत्येक मामले में जहां बहाली का उपयोग किया गया था - दस वर्षों में - एक समस्या बन गई थी और एक अधिक उपयुक्त डिजाइन ने इसे बदल दिया था। मूल रूप से, पुनरारंभ के प्रत्येक उपयोग ने अमूर्तता के अलग स्तर को रखने में विफलता का प्रतिनिधित्व किया था। प्रत्येक मामले में जहां बहाली का उपयोग किया गया था - दस वर्षों में - एक समस्या बन गई थी और एक अधिक उपयुक्त डिजाइन ने इसे बदल दिया था। मूल रूप से, पुनरारंभ के प्रत्येक उपयोग ने अमूर्तता के अलग स्तर को रखने में विफलता का प्रतिनिधित्व किया था।
C ++ में असली जीत RAII होती है , जो त्रुटियों के दौरान संसाधन के निपटारे को संभालने में बहुत आसान बनाती है। (यह करने की आवश्यकता के साथ दूर नहीं करता है throw
और try
- catch
, लेकिन इसका मतलब है कि आप की जरूरत नहीं है finally
।)
मुझे लगता है कि जिस चीज ने उन्हें अपवाद की जरूरत थी उन्हें आश्वस्त किया है वह सामान्य कंटेनर है: कंटेनर लेखक को उन त्रुटियों के प्रकारों के बारे में कुछ नहीं पता है जिनमें निहित वस्तुओं को वापस करने की आवश्यकता हो सकती है (बहुत कम उन्हें कैसे संभालना है), लेकिन कोड जो उन वस्तुओं को सम्मिलित करता है कंटेनर को कुछ पता होना चाहिए कि उन वस्तुओं का इंटरफ़ेस क्या है। लेकिन चूंकि हम जानते हैं कि निहित वस्तुएं किस प्रकार की त्रुटियों को फेंक सकती हैं, इसलिए हम अपवाद प्रकारों पर मानकीकरण नहीं कर सकते। (कंट्रासेप्टिवली: यदि हम अपवाद प्रकारों को मानकीकृत कर सकते हैं तो हमें अपवादों की आवश्यकता नहीं होगी।)
दूसरी बात जो लोग वर्षों से सीखते आ रहे हैं वह यह है कि अपवाद विनिर्देशों को किसी भाषा में सही ढंग से रखा जाना कठिन है। उदाहरण के लिए इसे देखें: http://www.gotw.ca/publications/mill22.htm , या यह: http://www.gotw.ca/gotw/082.htm । (और यह सिर्फ C ++ नहीं है, जावा प्रोग्रामर्स के पास चेक बनाम अनियंत्रित अपवादों के साथ अपने अनुभवों के बारे में लंबे तर्क हैं ।)
अपवादों के इतिहास पर थोड़ा। क्लासिक पेपर है: जॉन बी। गुडेनफ: "अपवाद हैंडलिंग: मुद्दों और एक प्रस्तावित संकेतन," सांप्रदायिक। एसीएम 18 (12): 683-696, 1975। लेकिन इससे पहले अपवादों को जाना जाता था। मेसा उनके पास लगभग 1974 में था, और PL / I के पास भी हो सकता था। Ada में 1980 से पहले एक अपवाद तंत्र था। मेरा मानना है कि C ++ के अपवादों को 1976 से लगभग बारबरा लिस्कॉव की CLU प्रोग्रामिंग भाषा के साथ अनुभव से सबसे अधिक प्रभावित किया गया था। Barbara Liskov: "CLU का इतिहास," प्रोग्रामिंग भाषाओं के इतिहास में --- II , थॉमस जे। बर्गिन, जूनियर और रिचर्ड जी। गिब्सन, जूनियर (एड्स)। पीपी। ४ p१-५१०, एसीएम, १ ९९ ६ ।