2010-09-27 19 views
15

एक try ब्लॉक में एक अपवाद होती है, तो कैसे निष्पादन catch ब्लॉक करने के लिए स्थानांतरित कर रहा है? यह सी #/जावा/सी ++ प्रश्न नहीं है, मैं बस सोच रहा हूं कि यह आंतरिक रूप से कैसे काम करता है।लागू/प्रयास ब्लॉक कैसे लागू किए जाते हैं?

उत्तर

8

यह सी #/जावा/सी ++ प्रश्न नहीं है। यह आंतरिक रूप से कैसे काम करता है, लाइन कैच स्टेटमेंट कैसे जाना जानता है।

यह कैसे काम करता है आंतरिक रूप से (क्योंकि इसे दूसरे तरीके से लागू किया जाएगा) इस काफी एक सी #/जावा/सी ++ सवाल बना देता है।

जावा में, एक कोशिश ब्लॉक एक विशेष तालिका में ही स्थापित (वर्ग फ़ाइल में)। जब JVM अपवाद फेंकता है, तो यह उस तालिका को देखता है कि अगली पकड़ या अंत में जाने के लिए ब्लॉक कहां है।

6

जब कोई अपवाद होता है तो एक विशेष निर्देश निष्पादित होता है (आमतौर पर को बाधित करता है)। इससे एक सामान्य त्रुटि हैंडलर निष्पादित होता है जो कि नवीनतम स्थापित अपवाद हैंडलर को स्थापित करता है। उस हैंडलर को तब निष्पादित किया जाता है।

+0

वह यह है कि सभी जानते हैं .. बच्चे हैंडलर से सिस्टम सॉफ्टवेयर/विधानसभा/पहले .. मैं उम्मीद कर रहा हूँ जवाब निष्पादित।नेट फ्रेमवर्क – selvaraj

+0

क्या आप बता सकते हैं कि विशेष निर्देश जो भी आपको लगता है – selvaraj

+2

@saj: देशी सी ++ प्रोग्राम में एक विशेष प्रोसेसर निर्देश 'int' का उपयोग किया जाता है जिसे प्रोग्राम निष्पादित और रोक दिया जाता है और फिर नियंत्रण स्वचालित रूप से ऑपरेटिंग सिस्टम इंटरप्ट हैंडलर में स्थानांतरित हो जाता है बदले में यह देखता है कि यह एक सी ++ अपवाद है और सी ++ अपवाद हैंडलर पर नियंत्रण स्थानांतरित करता है। – sharptooth

0

यह कुछ हद तक इस तरह सभी Langues में काम करना चाहिए:

if (error_occured xy while doing things in try){ 
    call_catch_part(error xy) 
} 
0

यह मूल रूप से भाषा की बुनियादी बातों को पार्स कर रहा है। भले ही कोई अपवाद दर असल निपटने है आप Here

0

में सभी जानकारी प्राप्त कर सकते हैं आप सी में एक ही कर सकता है।

वहां आप setjmp/longjmp दुर्भाग्यवश उपयोग करते हैं तो आपको स्टैक को अनचाहे नहीं मिलता है और खुद को सभी नट-किरकिरा को संभालना पड़ता है।

5

एक अंतर है कि जावा या सी # जैसे वर्चुअल मशीन पर निष्पादित बाइट-कोड का उपयोग करके सी ++ और भाषाओं जैसे मूल रूप से संकलित भाषाओं के बीच तकनीकी रूप से कैसे अपवाद किए जाते हैं।

सी ++ compilers आमतौर पर कोड है कि सूचना अपवाद कार्यावधि में से निपटने के लिए आवश्यक प्रोटोकॉल उत्पन्न करते हैं। एक समर्पित डेटा संरचना का उपयोग प्रयास ब्लॉक/संबंधित अपवाद हैंडलर के प्रवेश/निकास को याद रखने के लिए किया जाता है। जब कोई अपवाद होता है, तो एक बाधा उत्पन्न होती है और नियंत्रण ओएस को पास किया जाता है जो बदले में कॉल स्टैक का निरीक्षण करता है और यह निर्धारित करता है कि कौन से अपवाद हैंडलर को कॉल करना है।

अधिक जानकारी बहुत अच्छी तरह से विशाल कोचर द्वारा निम्न आलेख में वर्णन किया गया है:

How a C++ compiler implements exception handling

जावा में या .NET जानकारी से निपटने के अपवाद को बनाए रखने की भूमि के ऊपर के लिए कोई जरूरत नहीं है क्योंकि रनटाइम संबंधित अपवाद हैंडलर को खोजने के लिए बाइट कोड का निरीक्षण करने में सक्षम होगा। नतीजतन, केवल अपवाद जो वास्तव में फेंक दिए जाते हैं, वे उपरिवर्तित होते हैं।

संबंधित मुद्दे