Apa yang dimaksud dengan "pengecualian kesempatan pertama"?

103

Apa sebenarnya pengecualian kesempatan pertama? Bagaimana dan dari mana asalnya dalam program .NET? Dan mengapa disebut dengan nama yang aneh itu ('kesempatan' apa yang kita bicarakan)?

Frederick The Fool
sumber

Jawaban:

78

Ini adalah konsep debugging. Pada dasarnya pengecualian dilemparkan ke debugger terlebih dahulu dan kemudian ke program sebenarnya di mana jika tidak ditangani, ia akan dilemparkan ke debugger untuk kedua kalinya, memberi Anda kesempatan untuk melakukan sesuatu dengannya di IDE Anda sebelum dan setelah aplikasi itu sendiri. Ini tampaknya merupakan penemuan Microsoft Visual Studio.

annakata
sumber
21
Ini lebih dari sekedar konsep debugging; C # tidak menyediakan cara yang mudah untuk mengamati penanganan pengecualian dua lintasan pada waktu proses, tetapi vb.net menyediakannya. Pada dasarnya, ketika pengecualian dilemparkan, waktu proses dimulai dengan mencari tumpukan panggilan untuk mencari tahu siapa jika ada yang akan menangkapnya. Proses itu terjadi sebelumfinally blok apa pun berjalan. Setelah sistem memutuskan siapa yang akan menangkap pengecualian (dan menentukan bahwa seseorang benar-benar akan melakukannya), sistem akan mulai melepas tumpukan. Perhatikan bahwa jika pengecualian dilempar dari finallyblok ...
supercat
18
... kode yang diharapkan untuk menangkap pengecualian asli mungkin akhirnya tidak melakukannya; ada banyak kasus sudut aneh.
supercat
5
Ini terjadi ketika Anda telah mengonfigurasi debugger untuk menghentikan semua pengecualian yang dilemparkan (bukan hanya pengecualian yang tidak tertangani), atau jika Anda "melangkah" ke dalam beberapa pernyataan yang muncul. Anda melihat pesan Pengecualian kesempatan pertama dari jenis 'foo' terjadi di YourApp.exe . Anda masih dapat melanjutkan (F5) atau melangkah lebih jauh (F11). Kemudian jika ada catchuntuk ini, kontrol pergi ke sana. Jika tidak ada catchblokir, Anda mendapatkan jeda "kesempatan kedua", kali ini pesannya adalah pengecualian jenis 'foo' yang tidak tertangani yang terjadi di YourApp.exe . Dari sini, mencoba melanjutkan atau melangkah lebih jauh tidak akan berhasil.
Jeppe Stig Nielsen
@supercat: Bagaimana cara saya mempelajari tentang detail seperti yang Anda sebutkan dalam komentar Anda di atas? Apakah ini hasil dari eksperimen diri? membaca buku (yang mana)? Itu wawasan yang sangat mengesankan! Saya akan sangat menghargai jika Anda dapat meluangkan waktu untuk menjawab ini, tolong ...
anish
2
@NoSaidTheCompiler: Saya telah membaca tentang penanganan pengecualian di berbagai blog; Saya berharap bahwa pencarian untuk "filter pengecualian .net" akan memunculkan beberapa blog tentang subjek tersebut.
supercat
4

Saya baru saja mulai menggunakan debugger dan menemukan ini. Dalam penelitian saya, saya menemukan entri blog MSDN Apa itu Pengecualian Kesempatan Pertama?yang membersihkannya untuk saya.

Kesimpulan besar dari posting blog bagi saya adalah bahwa ini merujuk pada pemberitahuan ke debugger, dan bukan sesuatu yang perlu ditangani oleh kode saya, dan yang terpenting, "Pesan pengecualian kesempatan pertama paling sering tidak berarti ada masalah di kode."

ingatan
sumber
Harap berikan kutipan ( bukan keseluruhan artikel ) dari apa yang menurut Anda berguna dari tautan itu. Ada tautan sebelumnya hanya jawaban dengan tautan yang sama yang telah dihapus.
Mark Hall
Kesimpulan besar bagi saya adalah bahwa ini merujuk pada pemberitahuan ke debugger, dan bukan sesuatu yang perlu ditangani oleh kode saya, dan yang paling penting, "Pesan pengecualian kesempatan pertama paling sering tidak berarti ada masalah dalam kode."
codingatty
Saya menambahkan komentar Anda ke jawaban Anda, saya merasa bahwa tautan itu cukup penting untuk dijaga, saya mencoba memastikan bahwa itu tidak akan dianggap sebagai tautan hanya jawaban seperti sebelumnya yang diberikan.
Mark Hall
0

Saat aplikasi sedang di-debug, debugger akan diberi tahu setiap kali ada pengecualian. Pada titik ini, aplikasi ditangguhkan dan debugger memutuskan bagaimana menangani pengecualian. Pass pertama melalui mekanisme ini disebut pengecualian "kesempatan pertama".

Bergantung pada konfigurasi debugger, ia akan melanjutkan aplikasi dan meneruskan pengecualian atau membiarkan aplikasi ditangguhkan dan memasuki mode debug. Jika aplikasi menangani pengecualian, itu terus berjalan normal.

Pesan pengecualian kesempatan pertama paling sering tidak berarti ada masalah dalam kode. Untuk aplikasi / komponen yang menangani pengecualian dengan baik, pesan pengecualian kesempatan pertama memberi tahu pengembang bahwa situasi luar biasa telah ditemui dan ditangani.

David
sumber
0

Dari perspektif pengembang, ini lebih tentang pengecualian kesempatan kedua, karena itu berarti itu tidak ditangani dalam kode ; oleh karena itu aplikasi akan berhenti.

Kesempatan pertama bisa banyak dari mereka, tapi yang lebih diperhatikan, sekali lagi, dari perspektif pengembangan, adalah kesempatan kedua, karena itu akan menyebabkan aplikasi crash.

Agustin Garzon
sumber