(False == true), içeride istisna atarken blok yürütürse


152

Oldukça garip bir sorunum var.

Bu benim kodum:

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

Gerçekten basit görünüyor, Console.WriteLineya da vurmak gerekir throw. Nedense hep vuruyor throw.

Eğer throwkendi yöntemine geçersem iyi çalışır. Benim sorum nasıl ifblok görmezden ve isabet olduğunu throw new Exception:

İşte bazı kanıtlar

EDIT 1: imzayı dahil etmek için kodumu güncelledim, bu sorunla ilgili olmayan her şeyi kaldırdım ve çalıştırdım, hala oluyor.


5
@TimSchmelter resim hata ayıklanıyor, sarı vurgu kodun bulunduğu yer
George

5
Ben sadece boş bir çekirdek konsolu uygulaması oluşturdum, sadece kodunuzu yapıştırdı Mainve .... sürpriz, norepro. Ya yanılıyorsunuz ya da bazı önemli detayları kaçırdınız.
Jamiec

16
Bu bir asyncyöntemle şans eseri mi? Çünkü stackoverflow.com/questions/42528458/…
Matthew Watson

7
@George: kanıt yok çünkü eski hata ayıklama sembollerini kullanabilirsiniz. Hata ayıklama modunda yeniden derleyin ve yeniden başlayın.
Tim Schmelter

4
@TimSchmelter Yeniden derledim , temizledim, projeyi tekrar
George

Yanıtlar:


176

O içinde böcek gibi görünüyor asynckodu yöntemiyle değil aslında yürütülen ancak ayıklayıcı adımlar ile çizgiye throwaçıklamada. Bu satırların throwiçindeki ifadeden önce bazı kod ifsatırları yoksayılırsa, hata ayıklayıcı yalnızca ifade içeren satıra throwgider.

Ayrıca, kapanış küme ayracı için değişken - if (false)veya if (true == false)daha sonra doğru kod satırına hata ayıklayıcı adımları kullanmazsanız.

Bu hata @Matthew Watson tarafından Visual Studio ekibine gönderildi (bağlantı şu anda mevcut değil).

Ayrıca, benzer soruya bakın - Zaman uyumsuz yöntemde durum denetimi

DÜZENLEME (2017/10/06):

.Net Framework 4.7 kullanılarak sorun VS 2017 15.3.5'te çoğaltılamaz. Görünüşe göre VS ekibi bu sorunu çözdü.


20
Bu hata ayıklayıcı bir hata olduğunu bilmeden teşekkür ederim, muhtemelen delirdi.
George

121
Hata ayıklayıcıda bir hata mı? Ne kadar meta. :) ( daha önce hiç böyle bir hata yapmadım ... )
Simba

3
@George Umarım umursamazsınız, örneğinizi aldım ve kullanarak bir konsol uygulaması oluşturdum ve Roma'nın bağlandığı VS sorununa iliştirdim.
Obsidyen Phoenix

5
@Simba: Bana hiç hata ayıklamak için bir hata ayıklayıcı kullanmadığınızı söyleyin.
Joshua

3
Hmm. Hata, hata ayıklayıcı kendisi yerine derleyici tarafından oluşturulan hata ayıklama bilgi olabilir gibi görünüyor. MS'in yukarı veya aşağı oy vermeden önce Connect hatasını onaylamasını bekleyeceğim.
Adrian McCarthy

10

Sadece cevap için bir zeyilname, son zamanlarda aynı sorunla karşılaştım ve hata ayıklayıcıdaki gerçek x86 koduna baktım ve bunun gibi garip bir şekilde oluşturuldu (basitleştirilmiş):

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

Bu yüzden doğrudan yöntemin son talimatlarına atlamak yerine, ikinci koşulsuz atlama yanlışlıkla ifblok içindeki kodun bir parçası olarak kabul edildiğine inanıyorum çift atlama yapar .

Bu yüzden bu hatanın JIT derleyicisi ile ilgili olabileceğini tahmin ediyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.