Jangan hentikan debugger pada pengecualian ITU ketika dilempar dan ditangkap

91

Di alat / pengecualian, saya telah menetapkan opsi bahwa debugger berhenti ketika pengecualian dilemparkan. Apakah itu tertangkap atau tidak.

Bagaimana cara mengecualikan pengecualian dari aturan itu? Di suatu tempat di kode saya ada pengecualian tertangkap yang merupakan bagian dari logika program. Jadi saya jelas tidak ingin pengecualian itu menghentikan debugger setiap kali dipukul.

Contoh: Saya ingin mengabaikan pengecualian nullreference (yang tertangkap) di baris 344. Saya ingin menghentikan semua pengecualian lainnya

MichaelD
sumber
6
Jika pengecualian ini adalah bagian dari logika pemrograman Anda (pikirkan, jika Anda benar-benar harus menerapkannya dengan cara ini) - setidaknya pengecualian tersebut harus dibuat sendiri dan diturunkan. Dengan cara ini Anda dapat menerapkan solusi Brian.
tanascius
Inilah masalahnya: stackoverflow.com/questions/1957907/…
MichaelD
2
@tanascius - +1 Saya setuju dalam banyak kasus Pengecualian bukanlah cara terbaik untuk mengambil keputusan yang logis; namun dalam beberapa kasus seperti saat deserialisasi penanganan pengecualian terkadang tidak dapat dihindari, jadi throw> catch> handle adalah satu-satunya pilihan yang masuk akal.
jpierson
2
@Ando maaf saya buruk. Memoderasi banyak tab sekaligus memang efisien, tetapi tidak selalu akurat.
3
@tanascius: Anda mungkin masih harus menangkap pengecualian kerangka kerja yang diketahui sebelum Anda dapat memberikan tanggapan Anda sendiri. Saran Anda tidak selalu memungkinkan.
Dan Puzey

Jawaban:

40

Jika saya ingat dengan benar, Anda dapat menggunakan DebuggerStepThroughatribut pada metode yang berisi kode yang Anda tidak ingin pengecualian untuk diaktifkan. Saya kira Anda dapat mengisolasi kode yang mengaktifkan pengecualian yang mengganggu dalam sebuah metode dan menghiasinya dengan atribut.

Chris Chou
sumber
31
Dari jawaban malinger, dan pengalaman saya, jawaban ini sepertinya salah. The DebuggerStepThroughatribut tidak mempengaruhi perilaku debugger dengan pengecualian pertama-kesempatan.
Michael Petrotta
5
@ Tim, saya menguji dan TIDAK berhenti.
periksa
1
+1 berfungsi di VS2010 untuk kode .NET 4.0 dan Silverlight 4 murni untuk pengecualian yang tidak tertangani.
Mike Post
6
Catatan penting: Ini tidak berfungsi untuk metode tipe async-await. Lebih lanjut di sini
i3arnon
8
Per MSDN, DebuggerStepThroughatribut tidak memiliki arti untuk CLR. Ini ditafsirkan oleh debugger. Tampaknya ini tidak dapat diandalkan dalam berbagai keadaan, dan itu DebuggerHiddenakan bekerja dengan andal stackoverflow.com/a/3455100/141172
Eric J.14
65

DebuggerHidden adalah temanmu!

Runtime bahasa umum tidak memasang semantik ke atribut ini. Ini disediakan untuk digunakan oleh debugger kode sumber. Misalnya, Visual Studio 2005 debugger tidak berhenti di metode yang ditandai dengan atribut ini dan tidak mengizinkan titik henti sementara ditetapkan dalam metode. Atribut debugger lain yang dikenali oleh debugger Visual Studio 2005 adalah DebuggerNonUserCodeAttribute dan DebuggerStepThroughAttribute.

Diuji di VS2010 dan berfungsi dengan baik.

Meskipun DebuggerStepThroughtampaknya juga berfungsi untuk beberapa versi debugger tertentu, DebuggerHiddentampaknya berfungsi untuk berbagai situasi berdasarkan komentar untuk kedua jawaban.

Perhatikan bahwa kedua opsi saat ini tidak berfungsi dengan metode blok iterator atau untuk metode async / await . Ini dapat diperbaiki di pembaruan Visual Studio.

Shimmy Weitzhandler
sumber
mengerjakan VS2008. Anda harus menerapkannya ke seluruh metode termasuk blok tangkapan, atau Anda akan berhenti di tempat lain
Mark Heath
1
Saya menambahkan atribut itu ke sebuah metode dan debugger hanya berhenti pada metode pemanggilannya saja. Apakah saya melewatkan sesuatu?
Doogal
1
Begitulah seharusnya. untuk menghindarinya, Anda harus menangani pengecualian ... Atau sebagai alternatif, tandai metode pemanggil DebuggerHiddenjuga ...
Shimmy Weitzhandler
1
Perhatikan, bahwa atribut DebuggerStepThrough harus cukup untuk menghindari kerusakan pada pengecualian. DebuggerHidden bertindak seperti kombinasi DebuggerNonUserCode dan Atribut DebuggerStepThrough.
jpierson
14

DebuggerStepThrough adalah salah satu yang akan digunakan untuk mencegah debugger rusak dalam metode di mana ada coba / tangkap.

Tetapi ini hanya berfungsi jika Anda tidak menghapus centang opsi "Aktifkan Hanya Kode Saya (Hanya Dikelola)" di pengaturan Umum Opsi Debugging Visual Studio (menu Alat / Opsi, node Debugging / Umum) ...

Info selengkapnya tentang atribut tersebut di http://abhijitjana.net/2010/09/22/tips-on-debugging-using-debuggerstepthrough-attribute/

DebuggerHidden hanya akan mencegah Debugger menampilkan metode di mana pengecualian dilemparkan. Sebaliknya, ini akan menampilkan metode pertama pada tumpukan yang tidak ditandai dengan atribut itu ...

Valery Letroye
sumber
1
Perhatikan bahwa ini tidak lagi berfungsi secara default di VS 2015, lihat blog VS untuk cara mengaktifkannya
bhh
Sayangnya penyelesaian VS 2015 tidak berhasil untuk VS 2019.
Jonathan Allen
13

Atribut yang ditentukan dalam jawaban lain (dan yang lain seperti DebuggerNonUserCodeatribut) tidak lagi bekerja dengan cara yang sama secara default di Visual Studio 2015. Debugger akan merusak pengecualian di pasar metode dengan atribut tersebut, tidak seperti di versi VS. Untuk mematikan peningkatan kinerja yang mengubah perilakunya, Anda perlu mengubah pengaturan registri:

reg add HKCU\Software\Microsoft\VisualStudio\14.0_Config\Debugger\Engine /v AlwaysEnableExceptionCallbacksOutsideMyCode /t REG_DWORD /d 1

Informasi lebih lanjut dapat ditemukan di blog studio visual .

(Ini mungkin harus menjadi komentar pada jawaban teratas tetapi saya tidak memiliki cukup reputasi)

bhh
sumber
3

Anda tidak dapat memilih pengecualian yang dilemparkan di tempat tertentu dalam kode Anda. Namun Anda dapat menonaktifkan pengecualian dari jenis tertentu.

Jika kode Anda sendiri memunculkan pengecualian yang dimaksud, saya akan menjadikannya pengecualian khusus, yang berasal dari apa pun yang cocok, dan kemudian menonaktifkan debug melanggar pada jenis turunan ini.

Menonaktifkan pengecualian sistem sebagai NullReferenceException akan memengaruhi seluruh sistem, yang tentu saja tidak diinginkan selama pengembangan.

Perhatikan bahwa ada dua jenis perilaku putus untuk pengecualian:

  • Dilempar: Jika dipilih, hentikan segera setelah pengecualian jenis ini dilemparkan
  • User-unhandled: Jika dipilih, istirahat hanya jika pengecualian, jenis ini, tidak ditangani oleh coba / tangkap.

Anda dapat menghapus centang di 'Thrown' untuk NullReferenceException yang akan memberi Anda manfaat tidak melanggar setiap kali sistem Anda melewati baris yang dimaksud dalam kode Anda, tetapi tetap melanggar jika Anda memiliki beberapa ekspektasi NullReference yang tidak tertangani yang terjadi di bagian lain dari sistem.

Lars Udengaard
sumber
3
Menambahkan atribut DebuggerStepThrough ke metode di Visual Studio 2010 akan mencegah debugger menghentikan pengecualian yang tidak tertangani dilemparkan oleh metode.
Tim Murphy
Saya menguji dan itu tidak mencegah; itu masih berhenti
Shimmy Weitzhandler
1
@Shimmy - Bekerja untuk saya! Pastikan Anda menerapkan DebuggerStepThrough ke setiap metode dari titik pelemparannya hingga titik Anda ingin pengecualian terlihat dalam tumpukan panggilan. Jika Anda menangkap pengecualian dan menanganinya dalam hierarki panggilan di mana semua metode didekorasi dengan DebuggerStepThrough, Anda tidak akan pernah melihat kerusakan VS pada pengecualian itu.
jpierson