विभिन्न सॉफ़्टवेयर इंजीनियरिंग विषयों में कई दर्शन हैं कि पुस्तकालयों को त्रुटियों या अन्य असाधारण स्थितियों से कैसे सामना करना चाहिए। मैंने जिन लोगों को देखा है उनमें से कुछ:
- सूचक तर्क द्वारा दिए गए परिणाम के साथ एक त्रुटि कोड लौटाएं। पेट्सक यही करता है।
- प्रहरी मूल्य द्वारा वापसी त्रुटियों। उदाहरण के लिए, मॉलॉक NULL लौटाता है यदि यह मेमोरी आवंटित नहीं कर सकता है,
sqrt
तो NaN लौटाएगा यदि आप एक ऋणात्मक संख्या में गुजरते हैं, आदि। इस दृष्टिकोण का उपयोग कई परिवाद कार्यों में किया जाता है। - अपवाद फेंको। डील में इस्तेमाल किया। II, ट्रिलिनो, आदि।
- एक प्रकार की वापसी; उदाहरण के लिए C ++ फ़ंक्शन जो किसी प्रकार की वस्तु लौटाता है
Result
यदि वह सही ढंग से चलता है औरError
यह कैसे विफल हो जाता है इसका वर्णन करने के लिए एक प्रकार का उपयोग करता हैstd::variant<Error, Result>
। - मुखर और दुर्घटना का उपयोग करें। P4est और igraph के कुछ भागों में उपयोग किया जाता है।
प्रत्येक दृष्टिकोण के साथ समस्याएं:
- हर त्रुटि के लिए जाँच करने से बहुत सारे अतिरिक्त कोड मिलते हैं। जिन मूल्यों में परिणाम संग्रहीत किया जाएगा उन्हें हमेशा पहले घोषित करना होगा, बहुत सारे अस्थायी चर पेश किए जाएंगे जो केवल एक बार उपयोग किए जा सकते हैं। यह दृष्टिकोण बताता है कि क्या त्रुटि हुई, लेकिन यह निर्धारित करना कठिन हो सकता है कि क्यों, या, एक गहरी कॉल स्टैक के लिए, कहां।
- त्रुटि मामले को अनदेखा करना आसान है। यदि उत्पादन के प्रकारों की पूरी श्रृंखला एक प्रशंसनीय परिणाम है, तो उसके शीर्ष पर, कई कार्यों का सार्थक प्रहरी मूल्य भी नहीं हो सकता है। # 1 जैसी ही कई समस्याएं।
- केवल C ++, Python आदि में ही संभव है, C या Fortran में नहीं। सेटजम्प / लॉन्गजम्प टोना या लिबुनविंड का उपयोग करके सी में नकल की जा सकती है ।
- केवल C ++, Rust, OCaml इत्यादि में ही संभव है, C या Fortran में नहीं। मैक्रो टोना का उपयोग करके सी में नकल की जा सकती है।
- संभवतः सबसे अधिक जानकारीपूर्ण। लेकिन अगर आप इस दृष्टिकोण को अपनाते हैं, तो एक सी लाइब्रेरी, जिसे आप तब के लिए पायथन रैपर लिखते हैं, एक सरणी में एक आउट-ऑफ-बाउंड्स इंडेक्स पास करने जैसी मूर्खतापूर्ण गलती पायथन दुभाषिया को दुर्घटनाग्रस्त कर देगी।
त्रुटि-हैंडलिंग के बारे में इंटरनेट पर अधिकांश सलाह ऑपरेटिंग सिस्टम, एम्बेडेड विकास या वेब अनुप्रयोगों के दृष्टिकोण से लिखी गई हैं। दुर्घटनाएं अस्वीकार्य हैं और आपको सुरक्षा के बारे में चिंता करनी होगी। वैज्ञानिक अनुप्रयोगों में ये समस्याएँ लगभग एक ही सीमा तक नहीं होती हैं, यदि हो।
एक और विचार है कि किस प्रकार की त्रुटियां पुनर्प्राप्त करने योग्य हैं या नहीं। एक मॉलॉक विफल नहीं है और किसी भी मामले में, ओएस आउट-ऑफ-मेमोरी किलर आपको करने से पहले इसे प्राप्त कर लेगा। एक सरणी आकार के लिए सीमा से बाहर एक सूचकांक या तो वसूली योग्य नहीं है। मेरे लिए उपयोगकर्ता के रूप में, सबसे अच्छी बात यह है कि एक पुस्तकालय जो कर सकता है वह एक सूचनात्मक त्रुटि संदेश के साथ क्रैश करना है। दूसरी ओर, यह कहना, एक प्रत्यक्ष कारक सॉल्वर का उपयोग करके अभिसरण करने के लिए पुनरावृत्त रैखिक सॉल्वर को पुनर्प्राप्त किया जा सकता है।
वैज्ञानिक पुस्तकालयों को त्रुटियों की रिपोर्ट कैसे करनी चाहिए और उनसे निपटने की अपेक्षा करनी चाहिए? मुझे निश्चित रूप से पता है कि यह इस बात पर निर्भर करता है कि लाइब्रेरी किस भाषा में लागू की गई है। लेकिन जहाँ तक मैं बता सकता हूँ कि किसी भी पर्याप्त रूप से उपयोगी पुस्तकालय के लिए, लोग इसे जिस भाषा में लागू करते हैं, उसके अलावा कुछ अन्य भाषा से इसे कॉल करना चाहेंगे।
एक तरफ के रूप में, मुझे लगता है कि सार्वजनिक पुस्तकालय के हिस्से के रूप में एक वैश्विक पुस्तकालय हैंडलर फ़ंक्शन पॉइंटर को परिभाषित करने पर # 5 को सी लाइब्रेरी के लिए काफी सुधार किया जा सकता है। अभिकर्ता हैंडलर रिपोर्टिंग फ़ाइल / लाइन नंबर और दुर्घटनाग्रस्त होने के लिए डिफ़ॉल्ट होगा। इस लाइब्रेरी के लिए C ++ बाइंडिंग एक नए मुखर हैंडलर को परिभाषित करेगा जो इसके बजाय C ++ अपवाद फेंकता है। इसी तरह, पायथन बाइंडिंग एक मुखर हैंडलर को परिभाषित करेगा जो पायथन अपवाद को फेंकने के लिए सीपीथॉन एपीआई का उपयोग करता है। लेकिन मुझे ऐसा कोई उदाहरण नहीं पता है जो इस दृष्टिकोण को ले।