6

निम्न कोड में, पहले पुनरावृत्ति पर मुझे अपवाद मिलता है, और दूसरी तरफ मुझे कोई त्रुटि संदेश मुद्रित होने के साथ सेगमेंटेशन गलती मिलती है। ऐसा लगता है कि अपवाद पकड़ा नहीं गया है:मुझे अपवाद के बजाय एक सेगमेंटेशन गलती मिली है

int i = 0; 
while(i++ < 10) 
{ 
    try { 
     cout << "Iteration: " << i << endl; 
     // Code... 
     cout << "OK" << endl; 
    } 
    catch(...) 
    { 
     cerr << "Error message" << endl; 
     continue; 
    } 
} 

Output: 
Iteration 1 
Error message 
Iteration 2 
Segmentation fault 

क्या यह सामान्य है, या वास्तव में कुछ गलत चल रहा है?

यदि यह प्रासंगिक होना चाहिए, तो उस कोड ब्लॉक में मैं एक MySQL कनेक्शन रीसेट करता हूं, और अपवाद उत्पन्न होता है जब मैं जांचता हूं कि कनेक्शन बंद है या नहीं।

धन्यवाद।


प्लेटफार्म:
लिनक्स - OpenSuse 11.4
सी ++ - जीसीसी 4.5.1
इंटेल जिऑन

+2

विभाजन दोष हैं। 'try-catch' द्वारा पकड़ा नहीं गया है। इसके बजाय आपको इसे पकड़ने के लिए डीबगर का उपयोग करना चाहिए। –

+10

मुझे पूरा यकीन है कि यह आपके '// कोड ...' में होना चाहिए। आपके द्वारा पोस्ट की गई पोस्ट में सेगफॉल्ट स्पॉट्स को नहीं खोज सकता। .. – kratenko

+0

मैं लिखने के द्वारा अपने आउटपुट को डुप्लिकेट करने में कामयाब रहा हूं 'अगर (i == 1) 0 फेंक दें; अन्यथा i = * (int *) 0;' लेकिन यह नहीं है कि आपका '// कोड' क्या है, है ना? –

उत्तर

16

चूंकि segfaults सॉफ़्टवेयर के कारण (सीधे) नहीं होते हैं, बल्कि प्रोसेसर द्वारा यह पता लगाते हुए कि आप अमान्य मेमोरी तक पहुंचने का प्रयास कर रहे हैं (या अमान्य तरीके से स्मृति एक्सेस करें - उदाहरण के लिए लिखने-सुरक्षित, स्मृति को लिखना मेमोरी जिसे निष्पादित नहीं किया जाना चाहिए, आदि), यह try/catch के साथ "पकड़ने योग्य" नहीं है, जिसे अपवाद फेंकने वाले सॉफ़्टवेयर को पकड़ने के लिए डिज़ाइन किया गया है। उन्हें दोनों अपवाद कहा जाता है, लेकिन वे सिस्टम के सॉफ्टवेयर/हार्डवेयर के विभिन्न स्तरों पर उत्पन्न होते हैं।

तकनीकी रूप से, आप SIGSEGV के लिए सिग्नल हैंडलर के साथ segfaults पकड़ सकते हैं। हालांकि, जैसा कि Ivaylo बताता है, अगर आप segfault प्राप्त करते हैं, तो आमतौर पर, "फिर कोशिश करें" की अनुमति नहीं है। SIGSEGV के लिए सिग्नल हैंडर longjmp या exit पर अनुमति है, लेकिन केवल वापस नहीं आना चाहिए।

यहाँ संकेतों के बारे में और अधिक पढ़ें: http://www.alexonlinux.com/signal-handling-in-linux

ठेठ सी ++ अपवाद (throw के परिणाम) समस्या के बिना पुन: प्रयास किया जा सकता है (बेशक, एक ही अपवाद फिर से, निश्चित रूप से फेंक दिया जा सकता है

5

आप ऐसा विभाजन गलती नहीं पकड़ सकते। यह त्रुटि आमतौर पर अप्राप्य होती है और इसे सामान्य प्रयास-पकड़ से नियंत्रित नहीं किया जाता है। इसका मतलब है कि कुछ बहुत गलत हो सकता है शायद भ्रष्टाचार या इसी तरह के ढेर। सेगमेंटेशन गलती का कारण बनने के लिए valgrind का उपयोग करने का प्रयास करें।

+4

Segfaults भी एक अमान्य सूचक (शून्य या अन्यथा एक आवंटित क्षेत्र को इंगित करते हुए) को संदर्भित करते समय भी होता है जो एक सामान्य त्रुटि है, कुछ भी नाटकीय नाटक जैसे नाटकीय। – syam

1

catch क्लॉज अपवाद को पकड़ता है जो throw अभिव्यक्तियों द्वारा फेंक दिया जाता है। मानक सी ++ (और किसी भी सीन सी ++ कार्यान्वयन में) वे ऑपरेटिंग सिस्टम या हार्डवेयर द्वारा प्राप्त त्रुटियों को पकड़ने में करते हैं। अन्यथा ऐसा करने के लिए अपवाद-सुरक्षित कोड लिखना बहुत मुश्किल हो जाएगा।

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

  • कोई संबंधित समस्या नहीं^_^