मैं आपको त्रुटि नियंत्रण की सबसे असामान्य चर्चा देने का इरादा रखता हूं।
मैंने वर्षों पहले एक भाषा में एक बहुत अच्छा त्रुटि हैंडलर बनाया था, और हालांकि कुछ नाम बदल गए हैं, त्रुटि प्रसंस्करण के सिद्धांत आज भी समान हैं। मेरे पास एक कस्टम निर्मित मल्टी-टास्किंग ओएस था और सभी स्तरों पर डेटा त्रुटियों से पुनर्प्राप्त करने में सक्षम होना चाहिए, जिसमें कोई मेमोरी लीक, स्टैक विकास या क्रैश नहीं था। तो इस प्रकार मेरी समझ है कि त्रुटियों और अपवादों को कैसे संचालित किया जाना चाहिए और वे कैसे भिन्न होते हैं। मैं सिर्फ इतना कहूंगा कि मेरे पास इस बात की समझ नहीं है कि ट्राइ के कैच कैसे काम करते हैं, इसलिए मैं कुछ उपाय का अनुमान लगा रहा हूं।
त्रुटि प्रसंस्करण के लिए कवर के तहत होने वाली पहली चीज एक कार्यक्रम राज्य से दूसरे में कूद रही है। कैसे किया जाता है? मैं उस के लिए मिल जाएगा।
ऐतिहासिक रूप से, त्रुटियां पुरानी और सरल हैं, और अपवाद नए और थोड़े अधिक जटिल और सक्षम हैं। त्रुटियां तब तक ठीक काम करती हैं जब तक आपको उन्हें बुदबुदाने की जरूरत नहीं है, जो आपके पर्यवेक्षक को एक कठिन समस्या सौंपने के बराबर है।
त्रुटियां संख्याएं हो सकती हैं, जैसे त्रुटि संख्याएं, और कभी-कभी एक या अधिक संबद्ध स्ट्रिंग्स के साथ। उदाहरण के लिए यदि कोई फ़ाइल-पठन त्रुटि होती है, तो आप रिपोर्ट करने में सक्षम हो सकते हैं कि यह क्या है और संभवतः शालीनता से विफल है। (हे, यह पुराने दिनों की तरह बस दुर्घटनाग्रस्त होने से एक कदम है।)
अपवादों के बारे में अक्सर यह नहीं कहा जाता है कि अपवाद एक विशेष अपवाद स्टैक पर रखी गई वस्तुएं हैं। यह प्रोग्राम फ्लो के लिए एक रिटर्न स्टैक की तरह है, लेकिन यह त्रुटि की कोशिशों और कैच के लिए रिटर्न स्टेट है। (मैं उन्हें ePush और ePop कहता था, और? Abort एक सशर्त थ्रो था जो ePop होगा और उस स्तर तक पुनर्प्राप्त होगा, जबकि Abort एक पूर्ण मृत्यु या निकास था।)
स्टैक के निचले हिस्से पर शुरुआती कॉलर के बारे में जानकारी होती है, वह वस्तु जो राज्य के बारे में जानती है जब बाहरी कोशिश शुरू की गई थी, जो कि अक्सर तब होती है जब आपका कार्यक्रम शुरू किया गया था। शीर्ष पर, या स्टैक पर अगली परत, बच्चों के होने के साथ, और माता-पिता होने के नाते, अगली आंतरिक कोशिश / कैच ब्लॉक की अपवाद वस्तु है।
यदि आप एक कोशिश के अंदर एक कोशिश डालते हैं तो आप बाहरी कोशिश के शीर्ष पर आंतरिक कोशिश को रोक रहे हैं। जब आंतरिक प्रयास में कोई त्रुटि होती है और या तो आंतरिक पकड़ इसे संभाल नहीं सकती है या त्रुटि बाहरी प्रयास में फेंक दी जाती है, तो नियंत्रण बाहरी कैच ब्लॉक (ऑब्जेक्ट) में जाता है यह देखने के लिए कि क्या यह त्रुटि को संभाल सकता है, अर्थात आपके पर्यवेक्षक
तो यह त्रुटि स्टैक वास्तव में क्या करती है, प्रोग्राम फ्लो और सिस्टम स्थिति को चिह्नित करने और पुनर्स्थापित करने में सक्षम होने के लिए, दूसरे शब्दों में, यह किसी प्रोग्राम को रिटर्न स्टैक को क्रैश नहीं करने देता है और चीजों के गलत होने पर दूसरों (डेटा) को गड़बड़ कर देता है। इसलिए यह मेमोरी आवंटन पूल जैसे किसी भी अन्य संसाधन की स्थिति को भी बचाता है और इसलिए कैच होने पर यह उन्हें साफ कर सकता है। सामान्य तौर पर यह एक बहुत ही जटिल बात हो सकती है, और यही कारण है कि अपवाद हैंडलिंग अक्सर धीमी होती है। सामान्य तौर पर काफी हद तक इन अपवाद ब्लॉकों में जाने की जरूरत है।
तो एक कोशिश / पकड़ ब्लॉक सेट के एक राज्य के रूप में अगर अन्य सभी गड़बड़ हो जाता है पर लौटने में सक्षम हो। यह माता-पिता की तरह है। जब हमारा जीवन गड़बड़ हो जाता है तो हम अपने माता-पिता की गोद में वापस गिर सकते हैं और वे इसे फिर से सही कर देंगे।
आशा है कि मैंने आपको निराश नहीं किया।
Errors are generally unrecoverable
<- वास्तव में, यह वास्तव में सच नहीं है।E_ERROR
औरE_PARSE
दो सबसे आम अपरिवर्तनीय त्रुटियां हैं (कुछ अन्य हैं) लेकिन देव में आपको देखने वाली अधिकांश त्रुटियां पुनर्प्राप्त करने योग्य हैं (E_NOTICE
,E_WARNING
एट अल)। दुर्भाग्य से PHP की त्रुटि हैंडलिंग एक पूर्ण गड़बड़ है - सभी प्रकार की चीजें त्रुटियों को ट्रिगर करती हैं (उदाहरण के लिए, फ़ाइल सिस्टम फ़ंक्शन का विशाल बहुमत)। सामान्य अपवादों में "OOP तरीका" होता है, लेकिन दुर्भाग्य से PHP के कुछ मूल OOP API अपवादों के बजाय त्रुटियों का उपयोग करते हैं :-(