यदि (असत्य == सत्य) अपवाद को कार्यान्वित करता है, जब अपवाद फेंकना अंदर है


152

मुझे एक अजीब समस्या है जो हो रही है।

यह मेरा कोड है:

private async Task BreakExpectedLogic()
{
    bool test = false;
    if (test == true)
    {
        Console.WriteLine("Hello!");
        throw new Exception("BAD HASH!");
    }
}

वास्तव में सरल लगता है, यह हिट Console.WriteLineया नहीं होना चाहिए throw। किसी कारण के लिए यह हमेशा मार रहा है throw

अगर मैं throwअपने तरीके से आगे बढ़ता हूं तो यह ठीक काम करता है। मेरा सवाल यह है कि यह ifब्लॉक को कैसे नजरअंदाज कर रहा है throw new Exception:

यहाँ कुछ सबूत है

संपादित 1: मैंने हस्ताक्षर शामिल करने के लिए अपना कोड अपडेट कर दिया है, मैंने इस समस्या से जुड़ी हर चीज को हटा दिया है और इसे चलाया है, यह अभी भी होता है।


5
@TimSchmelter चित्र में यह डिबग किया जा रहा है, पीला हाइलाइट है जहां कोड है
जॉर्ज

5
मैंने अभी एक खाली कोर कंसोल ऐप बनाया है, जो आपके कोड को सिर्फ Main... और आश्चर्य, norepro में पेस्ट करता है। या तो आप गलत हैं या आपने कोई महत्वपूर्ण विवरण याद किया है।
जमीके

16
क्या यह asyncकिसी भी संयोग से एक विधि है? क्योंकि यह stackoverflow.com/questions/42528458/… के
मैथ्यू वॉटसन

7
@ जॉर्ज: अभी भी कोई सबूत नहीं है क्योंकि आप पुराने डिबग प्रतीकों का उपयोग कर सकते हैं। डीबग मोड में पुनरावर्ती और फिर से प्रारंभ करें।
टिम श्मेल्टर

4
@TimSchmelter मैंने परियोजना को फिर से शुरू किया, साफ किया, फिर से खोला, अगर ऐसा करने के विभिन्न तरीकों की कोशिश की, लेकिन अभी भी वही है
जॉर्ज

जवाबों:


176

यह asyncविधि में बग प्रतीत होता है , कोड को वास्तव में निष्पादित नहीं किया जाता है , लेकिन throwविवरण के साथ लाइन में डीबगर चरण होते हैं । यदि इन पंक्तियों के throwअंदर कथन से पहले कोड की कुछ पंक्तियों ifको नजरअंदाज किया जाता है, तो डिबगर केवलthrow कथन वाली रेखा पर चलते हैं ।

इसके अलावा, यदि आप चर का उपयोग नहीं करते हैं - if (false)या if (true == false)फिर कोड की सही रेखा पर डिबगर चरणों को बंद करने वाले घुंघराले ब्रेस पर ले जाते हैं।

इस बग को @Matthew Watson द्वारा Visual Studio टीम (लिंक अभी उपलब्ध नहीं है) द्वारा पोस्ट किया गया है ।

इसके अलावा, इसी तरह के प्रश्न को देखें - Async विधि में स्थिति जांच

EDIT (2017/10/06):

वी.एस. 2017 15.3.5 में .Net फ्रेमवर्क 4.7 का उपयोग करके समस्या को पुन: प्रस्तुत नहीं किया जा सकता है। वीएस टीम की तरह लगता है इस मुद्दे को तय किया है।


20
धन्यवाद, बिना यह जाने कि यह डीबगर में एक बग है, मैं संभवतः पागल हो गया हूं।
जॉर्ज

121
डीबगर में एक बग? कितना मेटा। :) (गायन मैं पहले कभी इस तरह से बग नहीं मिला ... )
सिम्बा

3
@ जॉर्ज मुझे आशा है कि आपको कोई आपत्ति नहीं है, मैंने आपका नमूना ले लिया है और इसका उपयोग करके एक कंसोल ऐप बनाया है, और इसे वीएस मुद्दे से जोड़ा है जिसे रोमा ने लिंक किया है।
ओब्सीडियन फीनिक्स

5
@ सिंबा: मुझे बताइए कि आपने कभी डीबगर का उपयोग स्वयं डीबग करने के लिए नहीं किया है।
जोशुआ

3
हम्म। ऐसा लगता है कि बग डीबगर में ही संकलक द्वारा उत्पन्न डिबग जानकारी में हो सकता है। मैं ऊपर या नीचे मतदान करने से पहले कनेक्ट बग को स्वीकार करने के लिए MS की प्रतीक्षा करूँगा।
एड्रियन मैकार्थी

10

उत्तर के लिए सिर्फ एक परिशिष्ट, मैंने हाल ही में एक ही मुद्दे का सामना किया है, और डीबगर में वास्तविक x86 कोड को देखा, और यह इस तरह से (सरलीकृत) एक अजीब तरीके से उत्पन्न हुआ था:

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret

इसलिए विधि के अंतिम निर्देशों पर सीधे कूदने के बजाय, यह डबल जंप करता है, जहां मेरा मानना ​​है कि दूसरी बिना शर्त कूद गलती से ifब्लॉक के अंदर कोड के एक भाग के रूप में मान्यता प्राप्त है ।

इसलिए मैं अनुमान लगाऊंगा कि यह बग JIT कंपाइलर से संबंधित हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.