2014-05-08 12 views
6

को क्रैश कर रहा है मुझे एक परीक्षक के साथ समस्या है कि मेरा एप्लिकेशन प्रारंभ में क्रैश हो रहा है। मैं और अधिक प्रवेश और अपवाद हैंडलिंग जोड़ा लेकिन यह अभी भी दुर्घटनाओं के साथ सामान्य संदेश के बजाय मेरी त्रुटि हैंडलिंग ट्रिगर "इस कार्यक्रम काम करना बंद कर दिया है"।पकड़ (...) अपवाद नहीं पकड़ रहा है, मेरा प्रोग्राम अभी भी

मेरा मुख्य() इस तरह दिखता है और catch(...) है जिसके तहत यह परिस्थितियों को ट्रिगर नहीं किया जाएगा?

try{ 
    simed::CArmApp app(0, cmd); 
    for(bool done = false;!done;) 
    { 
     done = !app.frame(); 
    } 
} catch(const std::runtime_error &e){ 
    handleApplicationError(e.what()); 
    return -1; 
} catch(...) { 
    handleApplicationError("Unknown Error"); 
    return -999; 
} 

मेरा कोड ओपनजीएल प्रतिपादन करने वाली लाइब्रेरी में कॉल कर रहा है, जहां मेरा मानना ​​है कि चीजें गलत हो रही हैं।

+1

मुझे यकीन नहीं है कि मैं समझता हूं। आप कैसे जानते हैं कि यह एक अपवाद अपवाद है? – kec

+0

क्योंकि 'हैंडल एप्प्लिकेशन एरर' नहीं कहा जा रहा है (यह एक संदेश बॉक्स उठाता है और मेरी स्प्लैशस्क्रीन को मारता है, इनमें से कोई भी नहीं हो रहा है) –

+0

लेकिन यह किसी अन्य प्रकार का प्रोग्राम क्रैश क्यों नहीं हो सकता है? – kec

उत्तर

7

यदि कोई सी ++ catch(...) ब्लॉक त्रुटियों को पकड़ नहीं रहा है तो शायद यह Windows त्रुटि की वजह से है।

विंडोज़ पर Structured Exception Handling नामक एक अवधारणा है, जहां ओएस अमान्य है, जो अमान्य है, जो अमान्य है, शून्य से विभाजित आदि को अस्वीकार करते समय "अपवाद" उठाता है। मैं "अपवाद" कहता हूं क्योंकि ये सी ++ अपवाद नहीं हैं ; बल्कि ये त्रुटियां गंभीर है कि Windows एक सी शैली फैशन में परिभाषित करता है कर रहे हैं - इस वजह से Win32 सी में लिखा गया था तो सी ++ अपवाद व्यवहार्य नहीं थे।

यह भी देखें: टिप्पणी के आधार पर

अद्यतन

तुम दोनों C++ अपवाद सौंपने और SEH चाहते हैं शायद आप निम्न (अवांछित) कोड का प्रयास कर सकते हैं:

__try 
{ 
    try 
    { 
     // Your code here... 
    } 
    catch (std::exception& e) 
    { 
     // C++ exception handling 
    } 
} 
__except(HandleStructuredException()) 
{ 
    // SEH handling 
} 
+0

दिलचस्प, धन्यवाद। यह तुरंत स्पष्ट नहीं है कि मैं दोनों को लागू करने का प्रयास कैसे करता हूं - या बल्कि मेरे उदाहरण कोड में मुझे इसे सुरक्षित रखने के लिए कैसे लिखना चाहिए। मैं _believe_ एक तृतीय पक्ष lib है जहां चीजें तोड़ रही हैं - वह lib सी ++ अपवाद फेंकती है इसलिए मुझे उम्मीद थी कि वे पकड़े गए हैं मेरे लिए बहुत सारी समस्याएं! क्या यह संभव है कि आप मेरे कोड का एक उदाहरण के रूप में उपयोग कर सकें, एक सही उत्तर के रूप में क्या करना है? –

+0

मैंने कुछ नमूना कोड जोड़ा है, शायद इसका उपयोग दोनों प्रकार के अपवादों को पकड़ने के लिए किया जा सकता है –

+0

यक (ऐसा करने के लिए, आपका कोड नहीं!) लेकिन ऐसा लगता है कि यह समाधान –

1

आप किसी भी वैश्विक वस्तुओं की घोषणा करते हैं? आप अपने मुख्य पाश के बाहर बनाए गए किसी भी वस्तुओं है, यही कारण है कि यह पकड़ा नहीं है समझा सकता है (यह आपके कोशिश पकड़ में नहीं है)।

इसके अलावा, क्या आपके आवेदन का थोड़ा और अधिक दिखाना संभव होगा? एक न्यूनतम उदाहरण?

+0

यह एक टिप्पणी होनी चाहिए ... – deviantfan

+0

यह निश्चित रूप से कोशिश कर रहा है कि अंदर से बुलाए गए किसी चीज़ के कारण यह क्रैश हो रहा है - मुझे कोड साबित करने के लिए लॉगिंग मिल रही है और फिर यह मर जाता है, लेकिन इनमें से कोई भी नहीं मेरी त्रुटि-हैंडलिंग ट्रिगर की गई है :( –

0

यदि एक अपवाद को किसी ऑब्जेक्ट के विनाशक द्वारा फेंक दिया जाता है जो एक अलग अपवाद को संभालने के लिए अवांछित स्टैक के परिणामस्वरूप नष्ट हो जाता है, तो प्रोग्राम catch(...) से बाहर निकल जाएगा या नहीं।

4

अब तक मैं जानता हूँ कि कम से कम दो स्थितियों में, जहां catch(...) नहीं कर सकते हैं वास्तव में पकड़

  1. 1 क्रिया के अपवाद की तुलना में अधिक हो सकता है,:, जब से पहले एक पहले हुआ अपवाद नियंत्रित किया जाता है एक अपवाद उठाया है तो C++ इसे संभाल नहीं कर सकते, और आवेदन दुर्घटना होगा।
  2. फेंकने अपवाद है कि अपवाद विनिर्देश सूची में नहीं है: अगर किसी भी विधि (किसी भी में ) एक अपवाद है जो अपवाद विनिर्देश सूची में नहीं है फेंकता है तो unexpected बुलाया जाएगा जो abort कहता है।
+0

+1, लेकिन मामले # 1 में, यह केवल "क्रैश" नहीं है, यह 'std :: terminate' के लिए एक कॉल है। – Angew

+0

@Angew, दाएं, डिफ़ॉल्ट रूप से 'टर्मिनेट' 'abort' भी कॉल करेगा, जैसे कि # 2। – Rakib

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