में कोशिश-पकड़ क्लॉज मैं सी ++ में एक प्रोग्राम लिख रहा हूं। कार्यक्रम Win32 (x86) के लिए ठीक काम कर रहा है, और हाल ही में मैंने इसे x64 के लिए मूल रूप से संकलित करने का प्रयास किया है। बेशक, सामान तुरंत काम नहीं किया था।सी ++ अपवाद "स्किप्स" एमएसवीसी x64
समस्या को दूर करने के बाद, मैं इस सरल कोड स्निपेट के साथ पुन: पेश करने में कामयाब रहे है:
class MyException { };
int main()
{
try {
for (;;) {
try {
std::cout << "Throwing" << std::endl;
throw MyException();
if (1 == 0) {
continue;
}
} catch (const MyException&) {
std::cout << "Catch 1" << std::endl;
}
}
} catch (const MyException&) {
std::cout << "Catch 2" << std::endl;
}
std::cout << "Done" << std::endl;
return 0;
}
(मैं if (1==0)
खंड जल्द ही समझाएंगे) जब इस कोड के लिए MSVC का उपयोग कर संकलन x86 (मैंने 2010 का उपयोग किया है), परिणाम अपेक्षित है:
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
...
और इसी तरह, एक अनंत लूप में।
हालांकि, में 64 परिणामों के लिए इस कोड संकलन:
Throwing
Catch 2
Done
अपवाद पूरी तरह से आंतरिक पकड़ खंड को छोड़ देता है!
यह तब होता है जब if (1 ==0)
खंड मेरे कोड में मौजूद होता है। जब मैं इसे हटा देता हूं, तो अपवाद को "कैच 1" में पकड़ा जाता है।
मैं अन्य कम्पाइलरों के उपयोग की कोशिश की है:
- इस बग भी अपेक्षा के अनुरूप वी.एस. 2012
- MinGW और MinGW-W64 काम में होता है।
मेरा प्रश्न: क्या यह एक एमएसवीसी बग है, या यह सी ++ में कुछ अपरिभाषित व्यवहार है, मुझे याद आ रही है? यदि यह वास्तव में एक एमएसवीसी बग है, तो मुझे कारण पर कुछ अंतर्दृष्टि सुनना अच्छा लगेगा।
धन्यवाद।
लगभग पूर्ण रूप से एक संकलक बग, यदि आप एमएस कनेक्ट पर एक बग रिपोर्ट फ़ाइल (आप इस सवाल का लिंक कर सकते हैं) और यहाँ एक लिंक छोड़ देते हैं, तो मैं इसे वोट दें होगा। यह देखना अच्छा लगेगा कि माइक्रोसॉफ्ट इंजीनियरों ने इसके बारे में क्या कहा है। –
अच्छा लगता है! मुझे अभी जाना है सबसे पहले, यह 64-बिट रिलीज बिल्ड पर लिंकर को क्रैश करता है। दूसरा, मैं इसे 'जारी रखने' के साथ पुन: पेश कर सकता हूं। इसके आसपास 'if' कथन अनावश्यक है। वीएस2012 अपडेट का उपयोग 3. – Steve
मैंने [एमएस कनेक्ट] पर एक बग रिपोर्ट खोली है (https://connect.microsoft.com/VisualStudio/feedback/details/806490/c-exception-skips-try-catch-clause-in -msvc-64)। –