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.WriteLine
atau throw
. Untuk beberapa alasan selalu memukul throw
.
Jika saya memindahkan throw
ke metode sendiri maka berfungsi dengan baik. Pertanyaan saya adalah bagaimana cara mengabaikan if
blok dan memukul throw new Exception
:
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.
c#
.net
visual-studio
.net-core
George
sumber
sumber
Main
dan .... kejutan, norepro. Entah Anda salah atau Anda melewatkan beberapa detail penting.async
metode yang kebetulan? Karena sepertinya mirip dengan stackoverflow.com/questions/42528458/…Jawaban:
Tampaknya menjadi bug dalam
async
metode, kode ini tidak benar - benar dieksekusi tetapi langkah-langkah debugger ke baris denganthrow
pernyataan. Jika ada beberapa baris kode sebelumthrow
pernyataan di dalamif
baris ini diabaikan, langkah debugger hanya ke baris denganthrow
pernyataan.Juga, jika Anda tidak menggunakan variabel -
if (false)
atauif (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.
sumber
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):
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
if
blok.Jadi saya akan berspekulasi bahwa bug ini mungkin terkait dengan kompiler JIT.
sumber