หาก (false == true) เรียกใช้งานบล็อกเมื่อมีการยกเว้นเกิดขึ้น


152

ฉันมีปัญหาที่ค่อนข้างแปลกที่เกิดขึ้น

นี่คือรหัสของฉัน:

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

ดูเหมือนง่ายจริงๆก็ไม่ควรกดหรือConsole.WriteLine ด้วยเหตุผลบางอย่างก็มักจะกดปุ่มthrowthrow

ถ้าฉันย้ายthrowเข้าไปในวิธีการของตัวเองมันก็ใช้ได้ดี คำถามของฉันคือการเพิกเฉยต่อifบล็อกและกดปุ่มthrow new Exception:

นี่คือหลักฐานบางอย่าง

แก้ไข 1:ฉันได้อัปเดตรหัสของฉันเพื่อรวมลายเซ็นฉันได้ลบทุกอย่างที่ไม่เกี่ยวข้องกับปัญหานี้และรันมันยังคงเกิดขึ้น


5
@ TimSchmelter รูปภาพกำลังดีบั๊กไฮไลท์สีเหลืองคือรหัสที่อยู่ที่
George

5
ฉันเพิ่งสร้างแอปคอนโซลหลักที่ว่างเปล่าเพียงวางโค้ดของคุณลงในMainและ .... เซอร์ไพรซ์, norepro ไม่ว่าคุณจะเข้าใจผิดหรือคุณพลาดรายละเอียดที่สำคัญ
Jamiec

16
นี่เป็นasyncวิธีการโดยบังเอิญหรือไม่? เพราะมันดูเหมือนกับstackoverflow.com/questions/42528458/ …
Matthew Watson

7
@ George: ยังไม่มีหลักฐานเพราะคุณอาจใช้สัญลักษณ์ debug แบบเก่า คอมไพล์ใหม่ในโหมดดีบักจากนั้นเริ่มอีกครั้ง
Tim Schmelter

4
@TimSchmelter ฉันได้คอมไพล์ใหม่ทำความสะอาดเปิดโครงการใหม่แล้วลองใช้วิธีที่ต่างกันในการทำ if แต่ยังคงเหมือนเดิม
George

คำตอบ:


176

ดูเหมือนว่าจะเป็นข้อผิดพลาดในasyncวิธีการรหัสไม่ได้ดำเนินการจริง แต่ขั้นตอนการดีบักไปยังบรรทัดที่มีthrowคำสั่ง หากมีบางบรรทัดของรหัสก่อนthrowคำสั่งภายในifบรรทัดเหล่านี้จะถูกละเว้นขั้นตอนการดีบักเฉพาะกับบรรทัดที่มีthrowคำสั่ง

นอกจากนี้หากคุณไม่ใช้ตัวแปร - if (false)หรือif (true == false)ขั้นตอนการดีบั๊กกับบรรทัดรหัสที่ถูกต้อง - ไปยังวงเล็บปีกกาปิด

ข้อผิดพลาดนี้ถูกโพสต์โดย@Matthew Watsonถึงทีม Visual Studio (ลิงก์ไม่สามารถใช้ได้ในขณะนี้)

โปรดดูคำถามที่คล้ายกัน - การตรวจสอบสภาพในวิธีการซิงค์

แก้ไข (2017/10/06):

ปัญหาไม่สามารถทำซ้ำได้ใน VS 2017 15.3.5 โดยใช้. Net Framework 4.7 ดูเหมือนว่าทีม VS ได้แก้ไขปัญหานี้แล้ว


20
ขอบคุณโดยไม่ทราบว่านี่เป็นข้อผิดพลาดในตัวดีบักฉันคงจะบ้าไปแล้ว
George

121
บั๊กในตัวดีบักหรือไม่? เมต้ามากแค่ไหน :) (การร้องเพลงฉันไม่เคยพบข้อผิดพลาดแบบนี้มาก่อน ... )
Simba

3
@ George ฉันหวังว่าคุณจะไม่เป็นไรฉันได้นำตัวอย่างของคุณและสร้างแอปคอนโซลที่ใช้มันและแนบกับปัญหา VS ที่ Roma เชื่อมโยงกับ
Obsidian Phoenix

5
@Simba: บอกฉันว่าคุณไม่เคยใช้ดีบักเกอร์เพื่อดีบักตัวเอง
Joshua

3
อืมมม ดูเหมือนว่าข้อผิดพลาดอาจเป็นข้อมูลการดีบักที่คอมไพเลอร์สร้างขึ้นแทนที่จะเป็นตัวดีบัก ฉันจะรอให้ MS รับทราบข้อผิดพลาดการเชื่อมต่อก่อนที่จะลงคะแนนขึ้นหรือลง
Adrian McCarthy

10

เป็นเพียงแค่ภาคผนวกของคำตอบเมื่อเร็ว ๆ นี้ฉันได้พบปัญหาเดียวกันและมองไปที่รหัส x86 ที่แท้จริงในการดีบักเกอร์และมันถูกสร้างขึ้นในรูปแบบแปลก ๆ เช่นนี้ (ประยุกต์):

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

ดังนั้นแทนที่จะกระโดดไปที่คำสั่งสุดท้ายของวิธีโดยตรงมันเป็นการกระโดดสองครั้งโดยที่ฉันเชื่อว่าการกระโดดที่ไม่มีเงื่อนไขครั้งที่สองนั้นได้รับการยอมรับอย่างผิดพลาดว่าเป็นส่วนหนึ่งของรหัสในifบล็อก

ดังนั้นฉันจะคาดเดาว่าข้อผิดพลาดนี้อาจเกี่ยวข้องกับคอมไพเลอร์ JIT

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.