Pertanyaan Jelaskan bug kritis di Visual Studio 2010 dan yang lebih baru, WinForms dan WPF


Coba letakkan kode berikut di dalamnya Load pengendali event untuk WinForms atau Loaded untuk WPF.

Dim doc As New XmlDocument
Dim nsmgr As New XmlNamespaceManager(Nothing) 'this line throws an exception

Masalahnya adalah pengecualian itu tidak dibuang, dan menumpuk korupsi terjadi. Mungkin memiliki efek samping yang berbeda, tergantung pada IDE - lihat di bawah.

  • IDE yang terpengaruh adalah: 2008, 2010, dan 2012 (yang dapat saya uji). 2010 me-reset status stack, dan kembali dari sub / handler, seperti tidak ada yang terjadi (tetapi tanpa melanjutkan dengan pernyataan lain di sana). 2012 mungkin memperingatkan pengguna tentang aplikasi yang gagal dan upaya untuk dijalankan compatibility mode. Lain kali setelah itu berjalan sama dengan 2010. 2008 benar melempar pengecualian, tetapi hanya pada konfigurasi default (AnyCPU). Beralih target platform ke x86 membuat masalah muncul kembali pada tahun 2008 juga.
  • Kerangka kerja yang terpengaruh adalah WinForms dan WPF. Aplikasi konsol dan ASP.NET tampaknya berfungsi dengan baik. .NET v2.0-4.5.
  • Lingkup yang terkena dampak hanya Load acara sejauh ini. Menempatkan kode ini ke dalam tombol membuatnya berhasil.
  • Bangunan yang terkena dampak konfigurasi = apa saja. Mencoba di default Debug dan Release.

Mengapa saya menganggapnya bug adalah karena dapat meninggalkan objek dalam keadaan tidak stabil - mereka tidak menyelesaikan inisialisasi, yang bukan perilaku yang diharapkan. Yang penting tentang hal itu adalah bahwa tidak ada yang akan tahu itu terjadi, karena tidak ada pengecualian. Tergantung pada desain Anda, Anda mungkin berakhir dengan data yang salah dalam database Anda, yang dalam kasus terburuk dapat menyebabkan konsekuensi yang berat.

Adakah yang memiliki penjelasan yang baik mengapa hal ini terjadi dan jika ada solusi?


7
2017-10-31 15:56


asal


Jawaban:


Masalahnya disebabkan oleh lapisan emulasi wow64 yang berperan ketika Anda menargetkan platform x86 pada OS x64.
Ini menelan pengecualian dalam kode yang bertanggung jawab untuk memecat acara Muat.
Jadi debugger tidak melihat pengecualian dan tidak bisa masuk untuk menangani situasi.
Artikel ini sepertinya mendokumentasikan apa yang terjadi di sana,

Jawaban sebelumnya dari Hans Passant (yang membahas semua kredit dan upvote) menjelaskan kemungkinan solusi.
Yang saya sukai adalah memindahkan semuanya dari acara Form_Load dan menempatkan kode bermasalah dalam bentuk konstruktor. (Tentu saja saya tidak tahu apakah itu berlaku dalam kasus Anda)


2
2017-10-31 22:33