यहां एक दिलचस्प तथ्य है: नहीं कोड त्रुटि मुक्त है - वास्तव में, कुछ कोड उद्देश्य पर "त्रुटियों" से भरा है।
किसी एप्लिकेशन में क्या त्रुटि है? एक त्रुटि एक समस्या का गलत कोडित समाधान है। ऐसे हैं तर्क त्रुटियों इससे गलत फ़ंक्शन परिणाम हो सकते हैं जहां सब कुछ एक साथ लगता है लेकिन आवेदन का परिणाम पूरी तरह से अनुपयोगी है। तर्क त्रुटियों के साथ, ए आवेदन काम करना बंद करे या न करे।
अपवाद आपके कोड में त्रुटियां शामिल कर सकते हैं जहां आप संख्याओं को शून्य से विभाजित करने का प्रयास करते हैं, या आप मुक्त मेमोरी ब्लॉकों का उपयोग करने का प्रयास करते हैं या किसी फ़ंक्शन को गलत पैरामीटर प्रदान करने का प्रयास करते हैं। हालांकि, एक आवेदन में एक अपवाद हमेशा एक त्रुटि नहीं है।
अपवाद और अपवाद वर्ग
अपवाद विशेष शर्तें हैं जिन्हें विशेष हैंडलिंग की आवश्यकता होती है। जब एक त्रुटि-प्रकार की स्थिति होती है, तो प्रोग्राम एक अपवाद उठाता है।
आप (एप्लिकेशन लेखक के रूप में) अपने एप्लिकेशन को अधिक त्रुटि-रहित बनाने और असाधारण स्थिति पर प्रतिक्रिया देने के लिए अपवादों को संभालेंगे।
ज्यादातर मामलों में, आप खुद को एप्लिकेशन लेखक और पुस्तकालय लेखक होने के नाते पाएंगे। इसलिए आपको यह जानना होगा कि अपवाद (अपनी लाइब्रेरी से) कैसे उठाएं और उन्हें (अपने आवेदन से) कैसे संभालें।
पर लेख त्रुटियों और अपवादों को संभालना असाधारण स्थितियों का जवाब देने या संभालने के लिए प्रयास / समाप्ति / प्रयास और अंत में / अंत में संरक्षित ब्लॉक का उपयोग करते हुए त्रुटियों के खिलाफ गार्ड करने के तरीके के बारे में कुछ बुनियादी दिशानिर्देश प्रदान करता है।
एक साधारण कोशिश / रखवाली ब्लॉकों को छोड़कर ऐसा लगता है:
प्रयत्न
ThisFunctionMightRaiseAnException ();
के सिवाय// यहां दिए गए ThisFunctionMightRaiseAnException () में उठाए गए किसी भी अपवाद को संभालें
समाप्त;
ThisFunctionMightRaiseAnException इसके कार्यान्वयन में, कोड की एक पंक्ति जैसी हो सकती है
बढ़ाने अपवाद। बनाएँ ('विशेष स्थिति!');
अपवाद sysutils.pas इकाई में परिभाषित एक विशेष वर्ग (नाम के सामने एक टी के बिना कुछ में से एक) है। SysUtils यूनिट कई विशेष उद्देश्य को परिभाषित करता है अपवाद वंशज (और इस प्रकार बनाता है अपवाद वर्गों का एक पदानुक्रम) जैसे इरिंजएर्र, ईडीबीबीजेरो, ईइंटोवरफ्लो, आदि।
ज्यादातर मामलों में, अपवाद जिन्हें आप संरक्षित प्रयास में संभालेंगे / ब्लॉक को छोड़कर अपवाद नहीं होगा (आधार) वर्ग लेकिन कुछ विशेष अपवाद वंश वर्ग वीसीएल या आपके द्वारा पुस्तकालय में परिभाषित किया गया है का उपयोग करते हुए।
कोशिश / छोड़कर प्रयोग अपवादों को संभालना
एक अपवाद प्रकार को पकड़ने और संभालने के लिए आप एक "टाइप_ऑफ_एक्ससेप्शन डू" अपवाद हैंडलर का निर्माण करेंगे। "अपवाद पर" क्लासिक केस स्टेटमेंट की तरह दिखता है:
प्रयत्न
ThisFunctionMightRaiseAnException;
excepton EZeroDivide dobegin// शून्य से विभाजित होने पर कुछसमाप्त;
पर EIntOverflow dobegin// कुछ जब बहुत बड़े पूर्णांक गणनासमाप्त;
elsebegin// कुछ जब अन्य अपवाद प्रकार उठाए जाते हैंसमाप्त;
समाप्त;
ध्यान दें कि दूसरा हिस्सा उन सभी (अन्य) अपवादों को हड़प लेगा, जिनमें आप कुछ भी नहीं जानते हैं। सामान्य तौर पर, आपके कोड को केवल उन अपवादों को संभालना चाहिए जिन्हें आप वास्तव में जानते हैं कि कैसे संभालना है और फेंकने की उम्मीद है।
इसके अलावा, आपको कभी भी "अपवाद" नहीं खाना चाहिए:
प्रयत्न
ThisFunctionMightRaiseAnException;
के सिवाय
समाप्त;
अपवाद खाने का मतलब है कि आप यह नहीं जानते कि अपवाद को कैसे संभालना है या आप नहीं चाहते कि उपयोगकर्ता अपवाद या बीच की किसी चीज़ को देख सकें।
जब आप अपवाद को संभालते हैं और आपको उससे अधिक डेटा की आवश्यकता होती है (आखिरकार यह एक वर्ग का उदाहरण है) बल्कि केवल उस प्रकार का अपवाद जो आप कर सकते हैं:
प्रयत्न
ThisFunctionMightRaiseAnException;
excepton E: अपवाद dobegin
शो मेसेज (E.Message);
समाप्त;
समाप्त;
"E" में "E: Exception" स्तंभ वर्ण के बाद निर्दिष्ट प्रकार का एक अस्थायी अपवाद चर है (उपरोक्त उदाहरण में बेस अपवाद वर्ग)। ई का उपयोग करके आप अपवाद ऑब्जेक्ट को मान पढ़ सकते हैं (या लिख सकते हैं), जैसे कि संदेश गुण प्राप्त करें या सेट करें।
अपवाद कौन है?
क्या आपने देखा है कि अपवाद वास्तव में अपवाद से उत्पन्न होने वाले वर्ग के उदाहरण कैसे हैं? कीवर्ड को एक अपवाद वर्ग उदाहरण फेंकता है। आप क्या बनाते हैं (अपवाद उदाहरण एक वस्तु है), आप भी मुक्त करने की जरूरत है. यदि आप (एक पुस्तकालय लेखक के रूप में) एक उदाहरण बनाते हैं, तो क्या एप्लिकेशन उपयोगकर्ता इसे मुफ्त करेगा?
यहाँ है डेल्फी जादू: एक अपवाद को संभालना स्वचालित रूप से अपवाद वस्तु को नष्ट कर देता है। इसका मतलब है कि जब आप "छोड़कर / अंत" ब्लॉक में कोड लिखते हैं, तो यह अपवाद मेमोरी जारी करेगा।
यदि ऐसा होता है तो क्या यह फाइटमाइटमैरिज एनीएक्ससेप्शन वास्तव में एक अपवाद को जन्म देता है और आप इसे नहीं संभाल रहे हैं (यह "इसे खाने" के समान नहीं है)?
जब नंबर / 0 संभाला नहीं है तो क्या होगा?
जब आपके कोड में एक अनहैंड अपवाद को फेंक दिया जाता है, तो डेल्फी फिर से उपयोगकर्ता को त्रुटि संवाद प्रदर्शित करके जादुई रूप से आपके अपवाद को संभालता है। ज्यादातर मामलों में, यह संवाद अपवाद के कारण को समझने के लिए उपयोगकर्ता (और अंत में आप) को पर्याप्त डेटा प्रदान नहीं करेगा।
यह डेल्फी के शीर्ष स्तर के संदेश लूप द्वारा नियंत्रित किया जाता है जहां सब अपवादों को वैश्विक अनुप्रयोग ऑब्जेक्ट और उसके हैंडल अपवाद प्रक्रिया द्वारा संसाधित किया जा रहा है।
विश्व स्तर पर अपवादों को संभालने के लिए, और अपना स्वयं का अधिक उपयोगकर्ता-अनुकूल संवाद दिखाने के लिए, आप TAPlicationEvents के लिए कोड लिख सकते हैं। OnException इवेंट हैंडलर।
ध्यान दें कि वैश्विक अनुप्रयोग ऑब्जेक्ट को फॉर्म यूनिट में परिभाषित किया गया है। TAPlicationEvents एक घटक है जिसका उपयोग आप वैश्विक अनुप्रयोग ऑब्जेक्ट की घटनाओं को रोकने के लिए कर सकते हैं।