Visual Studio: Bagaimana cara memecahkan pengecualian yang ditangani?

165

Saya ingin Visual Studio rusak ketika pengecualian yang ditangani terjadi (yaitu saya tidak hanya ingin melihat pesan "Kesempatan pertama", saya ingin men-debug pengecualian yang sebenarnya).

mis. Saya ingin debugger rusak kecuali:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

Saya menemukan catatan ini untuk Visual Studio.NET:

1) Dalam VS.NET, buka Menu Debug >> "Pengecualian ..." >> "Pengecualian Runtime Bahasa Umum" >> "Sistem" dan pilih "System.NullReferenceException"

2) Di bagian bawah dialog itu ada kotak grup "Ketika pengecualian dilemparkan:", pilih "Break into the debugger"

3) Jalankan skenario Anda. Ketika pengecualian dilemparkan, debugger akan berhenti dan memberi tahu Anda dengan dialog yang mengatakan sesuatu seperti: "Pengecualian dari tipe" System.NullReferenceException "telah dilemparkan. [Hancurkan] [Lanjutkan]"

Tekan [Hancurkan]. Ini akan menempatkan Anda pada baris kode yang menyebabkan masalah.

Tetapi mereka tidak berlaku untuk Visual Studio 2005 (tidak ada opsi Pengecualian pada menu Debug ).

Apakah ada yang tahu di mana menemukan dialog opsi ini di Visual Studio bahwa kotak grup " Ketika pengecualian dilemparkan ", dengan opsi untuk " Break into the debugger "?

Pembaruan: Masalahnya adalah menu Debug saya tidak memiliki item Pengecualian . Saya mengkustomisasi menu untuk menambahkannya secara manual.

Ian Boyd
sumber
9
Dalam VS2015 itu berada di bawah Debug-> Windows-> Pengaturan Pengecualian
PeterVermont
Butuh waktu untuk menemukan cara untuk mengembalikan para standar pengaturan pengecualian setelah saya mengubah beberapa pengaturan pengecualian, karena jawaban baru. mengembalikan pengaturan pengecualian ke default
Mabito

Jawaban:

170

Dengan solusi terbuka, buka opsi menu Debug - Pengecualian ( Ctrl+ D, E). Dari sana Anda dapat memilih untuk istirahat pada Thrown atau Pengguna-tidak ditangani pengecualian yang .

EDIT: Contoh saya sudah diatur dengan "profil" C # mungkin tidak ada untuk profil lain?

Austin Salonen
sumber
10
saya hanya tidak memiliki opsi seperti itu. Itu akan menjelaskan kebingungan saya.
Ian Boyd
58
saya memiliki menu debug, tetapi tidak ada opsi Pengecualian. saya mengkustomisasi menu untuk menambahkannya secara manual; tombol pintas berfungsi dengan baik (Ctrl + Alt + E)
Ian Boyd
3
Selain itu, Anda dapat mengatur ulang lingkungan VS2010, dengan pergi ke "Tools", "Impor Ekspor Pengaturan" dan pilih reset ke lingkungan C # ... itu berisi item Submenu Pengecualian
BeardinaSuit
14
Saya memilih Common Language Runtime Exceptions> di <All Common Language Runtime Exceptions not in this list>bawah Visual Studio 2017 dan semua impian saya yang paling liar menjadi kenyataan.
Aaron Newton
9
Visual Studio 2015: Debug -> Windows -> Pengaturan Pengecualian
achecopar
47

Ada jendela 'pengecualian' di VS2005 ... coba Ctrl+ Alt+ Eketika men-debug dan klik kotak centang 'Dilemparkan' untuk pengecualian yang ingin Anda hentikan.

Rob Walker
sumber
Itulah yang saya inginkan. Di mana menu itu? Untuk kehidupan saya, saya tidak dapat menemukannya.
Ian Boyd
Pintasan keyboard dapat berubah sesuai profil (pengembang C #, pengembang C ++, dll.)
Asaf R
1
Saya memiliki item menu: Debug -> Pengecualian. Ini dengan VS2005 Professional. Apakah Anda menjalankan edisi Express?
Rob Walker
5
jika Anda ingin item menu Pengecualian: Pilih Alat | Kustomisasi .... Klik pada tab Perintah. Pilih kategori Debug di kotak Kategori. Temukan item perintah Pengecualian ..., lalu seret ke menu Debug di bagian atas aplikasi, letakkan di tempat yang sesuai di menu. (ditemukan di komentar di: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/… )
sotto
33

Butuh waktu beberapa saat untuk menemukan tempat baru untuk pengaturan expection, oleh karena itu jawaban baru.

Sejak Visual Studio 2015 Anda mengontrol Pengecualian mana yang harus dihentikan di Jendela Pengaturan Pengecualian (Debug-> Windows-> Pengaturan Pengecualian). Pintasannya masih Ctrl- Alt- E.

Cara paling sederhana untuk menangani pengecualian khusus adalah memilih "semua pengecualian yang tidak ada dalam daftar ini".

Ini screenshot dari versi bahasa Inggris:

masukkan deskripsi gambar di sini

Ini screenshot dari versi Jerman:

masukkan deskripsi gambar di sini

Pemula
sumber
16

Dari Visual Studio 2015 dan selanjutnya, Anda perlu pergi ke dialog "Pengaturan Pengecualian" ( Ctrl+ Alt+ E) dan mencentang "Pengecualian Runtime Bahasa Biasa" (atau Pengecualian Runtime Bahasa Biasa "(atau yang spesifik yang Anda inginkan yaitu ArgumentNullException) untuk membuatnya berhenti pada pengecualian yang ditangani .

Langkah 1 Langkah 1 Langkah 2 Langkah 2

Sameer Alibhai
sumber
8

Periksa Mengelola Pengecualian dengan halaman Debugger , ini menjelaskan cara mengaturnya.

Pada dasarnya, ini adalah langkah-langkahnya (selama debugging):

  1. Pada menu Debug, klik Pengecualian.

  2. Di kotak dialog Pengecualian, pilih Diberikan untuk seluruh kategori pengecualian, misalnya, Pengecualian Waktu Runtime Bahasa Umum.

    -atau-

    Perluas node untuk kategori pengecualian, misalnya, Pengecualian Waktu Runtime Bahasa Umum, dan pilih Lempar untuk pengecualian tertentu dalam kategori itu.

Guy Starbuck
sumber
1

Teknik yang saya gunakan adalah sesuatu seperti berikut ini. Tentukan variabel global yang dapat Anda gunakan untuk satu atau beberapa blok tangkap percobaan tergantung pada apa yang Anda coba debug dan gunakan struktur berikut:

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

Saya menemukan ini memberi saya sedikit lebih banyak fleksibilitas dalam hal pengujian karena masih ada beberapa pengecualian saya tidak ingin IDE untuk istirahat.

Spencer Ruport
sumber
3
Ini adalah teknik yang berguna - mengubah pengecualian yang ditangani menjadi pengecualian yang tidak ditangani, sehingga debugger berhenti di atasnya secara otomatis. Saya tidak yakin mengapa itu dibatalkan, kecuali tidak ada cara yang baik untuk mengatur GlobalTestingBool Anda. Pilihan lain yang mungkin lebih baik adalah menggunakan Debugger. Terlampir.
Joe White
Anda harus menambahkan ini di setiap mencoba / menangkap dan mengkompilasi ulang kode Anda. Tidak terlalu berguna jika Anda sudah men-debug sesuatu.
Maks
Pengecualian harus dimasukkan dalam kode jika ada kondisi luar biasa - sesuatu yang tidak dapat diterima - dan itu harus ditangkap pada tingkat di mana keputusan dapat dibuat tentang bagaimana menanganinya. Kode seperti ini terlalu mempersulit jalan eksekusi.
Lee Oades
saya tahu ini adalah jawaban yang sangat lama, tetapi untuk googler acak seperti saya, Anda bisa menambahkancatch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan 'splite' K.
0

Dokumentasi online sepertinya sedikit tidak jelas, jadi saya hanya melakukan tes kecil. Memilih untuk istirahat di Dilemparkan dari kotak Pengecualian dialog menyebabkan eksekusi program untuk istirahat pada setiap pengecualian, ditangani atau tidak tertangani. Jika Anda ingin memecah pengecualian yang ditangani saja, tampaknya satu-satunya jalan Anda adalah melalui kode Anda dan meletakkan breakpoint pada semua pengecualian yang ditangani. Ini sepertinya sedikit berlebihan, jadi mungkin lebih baik menambahkan pernyataan debug setiap kali Anda menangani pengecualian. Kemudian ketika Anda melihat output itu, Anda dapat mengatur breakpoint pada baris itu dalam kode.

markysdad
sumber