Jika (false == true) mengeksekusi blok ketika melempar eksepsi ada di dalam

152

Saya memiliki masalah yang agak aneh yang terjadi.

Ini kode saya:

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

Tampaknya sangat sederhana, tidak boleh mengenai Console.WriteLineatau throw. Untuk beberapa alasan selalu memukul throw.

Jika saya memindahkan throwke metode sendiri maka berfungsi dengan baik. Pertanyaan saya adalah bagaimana cara mengabaikan ifblok dan memukul throw new Exception:

Ini beberapa buktinya

EDIT 1: Saya telah memperbarui kode saya untuk menyertakan tanda tangan, saya telah menghapus semua yang tidak terkait dengan masalah ini dan menjalankannya, itu masih terjadi.

George
sumber
5
@TimSchmelter gambarnya sedang di-debug, highlight kuning adalah tempat kode berada
George
5
Saya baru saja membuat aplikasi konsol inti kosong, hanya menyisipkan kode Anda ke dalam Maindan .... kejutan, norepro. Entah Anda salah atau Anda melewatkan beberapa detail penting.
Jamiec
16
Apakah ini asyncmetode yang kebetulan? Karena sepertinya mirip dengan stackoverflow.com/questions/42528458/…
Matthew Watson
7
@ George: masih tidak ada bukti karena Anda mungkin menggunakan simbol debug yang lama. Kompilasi ulang dalam mode debug dan kemudian mulai lagi.
Tim Schmelter
4
@TimSchmelter Saya telah mengkompilasi ulang, membersihkan, membuka kembali proyek mencoba berbagai cara melakukan if, tetapi masih sama
George

Jawaban:

176

Tampaknya menjadi bug dalam asyncmetode, kode ini tidak benar - benar dieksekusi tetapi langkah-langkah debugger ke baris dengan throwpernyataan. Jika ada beberapa baris kode sebelum throwpernyataan di dalam ifbaris ini diabaikan, langkah debugger hanya ke baris dengan throwpernyataan.

Juga, jika Anda tidak menggunakan variabel - if (false)atau if (true == false)kemudian debugger langkah-langkah ke baris kode yang benar - ke kurung kurawal penutupan.

Bug ini telah diposting oleh @Matthew Watson ke tim Visual Studio (tautan tidak tersedia sekarang).

Juga, lihat pertanyaan serupa - Periksa kondisi dalam metode async

EDIT (2017/10/06):

Masalah tidak dapat direproduksi dalam VS 2017 15.3.5 menggunakan .Net Framework 4.7. Sepertinya tim VS telah memperbaiki masalah ini.

Roman Doskoch
sumber
20
Terima kasih, tanpa mengetahui ini adalah bug di debugger saya kemungkinan akan menjadi gila.
George
121
Bug di debugger? Sangat meta. :) (bernyanyi saya tidak pernah meta bug seperti ini sebelumnya ... )
Simba
3
@ George Saya harap Anda tidak keberatan, saya telah mengambil sampel Anda dan membuat aplikasi konsol menggunakannya, dan melampirkannya pada masalah VS yang telah ditautkan oleh Roma.
Obsidian Phoenix
5
@ Simba: Katakan padaku Anda belum pernah menggunakan debugger untuk men-debug itu sendiri.
Joshua
3
Hmm. Tampaknya bug bisa berada di info debug yang dihasilkan oleh kompiler daripada di debugger itu sendiri. Saya akan menunggu MS untuk mengakui bug Connect sebelum memberikan suara ke atas atau ke bawah.
Adrian McCarthy
10

Hanya sebuah tambahan untuk jawabannya, saya baru saja menemukan masalah yang sama, dan melihat ke kode x86 yang sebenarnya di debugger, dan itu dihasilkan dengan cara yang aneh seperti ini (disederhanakan):

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

Jadi alih-alih langsung melompat ke instruksi terakhir dari metode ini, ia melakukan lompatan ganda, di mana saya percaya lompatan tanpa syarat kedua secara keliru diakui sebagai bagian dari kode di dalam ifblok.

Jadi saya akan berspekulasi bahwa bug ini mungkin terkait dengan kompiler JIT.

Serge Semenov
sumber