Kami memiliki aplikasi WPF di mana sebagian dari itu dapat melempar pengecualian saat runtime. Saya ingin secara global menangkap pengecualian yang tidak ditangani dan mencatatnya, tetapi jika tidak melanjutkan eksekusi program seolah-olah tidak ada yang terjadi (seperti VB On Error Resume Next
).
Apakah ini mungkin dalam C #? Dan jika demikian, di mana tepatnya saya harus meletakkan kode penanganan pengecualian?
Saat ini saya tidak bisa melihat satu titik pun di mana saya bisa membungkus try
/ catch
sekitar dan yang akan menangkap semua pengecualian yang bisa terjadi. Dan bahkan kemudian saya akan meninggalkan apa pun yang telah dieksekusi karena hasil tangkapan. Atau apakah saya berpikir ke arah yang salah di sini?
ETA: Karena banyak orang di bawah menunjukkannya: Aplikasi ini bukan untuk mengendalikan pembangkit listrik tenaga nuklir. Jika macet itu bukan masalah besar tapi pengecualian acak yang sebagian besar terkait UI adalah gangguan dalam konteks di mana ia akan digunakan. Ada (dan mungkin masih) beberapa dari mereka dan karena menggunakan arsitektur plugin dan dapat diperpanjang oleh orang lain (juga siswa dalam kasus itu; jadi tidak ada pengembang berpengalaman yang mampu menulis kode bebas kesalahan sepenuhnya).
Adapun pengecualian yang tertangkap: Saya log mereka ke file log, termasuk jejak stack lengkap. Itulah inti dari latihan itu. Hanya untuk melawan orang-orang yang menggunakan analogi saya dengan OB VB secara harfiah.
Saya tahu bahwa membabi buta mengabaikan kelas kesalahan tertentu berbahaya dan dapat merusak aplikasi saya. Seperti yang dikatakan sebelumnya, program ini tidak penting untuk siapa pun. Tidak ada seorang pun yang waras yang berani mempertaruhkan kelangsungan hidup peradaban manusia. Ini hanyalah alat kecil untuk menguji pendekatan desain tertentu wrt. rekayasa Perangkat Lunak.
Untuk penggunaan langsung aplikasi, tidak ada banyak hal yang dapat terjadi dengan pengecualian:
- Tidak terkecuali penanganan - dialog kesalahan dan keluar aplikasi. Eksperimen harus diulang, meskipun mungkin dengan subjek lain. Tidak ada kesalahan yang telah dicatat, yang sangat disayangkan.
- Penanganan pengecualian umum - kesalahan jinak terperangkap, tidak ada salahnya dilakukan. Ini harus menjadi kasus umum yang dinilai dari semua kesalahan yang kami lihat selama pengembangan. Mengabaikan kesalahan semacam ini seharusnya tidak memiliki konsekuensi langsung; struktur data inti diuji cukup baik sehingga mereka akan dengan mudah bertahan hidup ini.
- Penanganan pengecualian umum - kesalahan serius terperangkap, mungkin macet pada titik berikutnya. Ini mungkin jarang terjadi. Kami belum pernah melihatnya sejauh ini. Kesalahan tetap dicatat dan kerusakan mungkin tidak terhindarkan. Jadi ini secara konseptual mirip dengan kasus pertama. Kecuali kita memiliki jejak stack. Dan dalam sebagian besar kasus, pengguna bahkan tidak akan melihatnya.
Adapun data percobaan yang dihasilkan oleh program: Kesalahan serius paling parah hanya akan menyebabkan tidak ada data yang direkam. Perubahan kecil yang mengubah hasil percobaan sedikit tidak mungkin. Dan bahkan dalam kasus itu, jika hasilnya tampak meragukan kesalahan telah dicatat; kita masih bisa membuang titik data itu jika itu adalah outlier total.
Untuk meringkas: Ya, saya menganggap diri saya masih setidaknya sebagian waras dan saya tidak menganggap pengecualian global menangani rutin yang membuat program berjalan harus benar-benar jahat. Seperti yang dikatakan dua kali sebelumnya, keputusan seperti itu mungkin valid, tergantung pada aplikasi. Dalam kasus ini, keputusan itu diadili sebagai keputusan yang sah dan bukan omong kosong total dan total. Untuk aplikasi lain apa pun keputusan itu mungkin terlihat berbeda. Tapi tolong jangan menuduh saya atau orang lain yang bekerja di proyek itu berpotensi meledakkan dunia hanya karena kita mengabaikan kesalahan.
Catatan: Hanya ada satu pengguna untuk aplikasi itu. Ini bukan sesuatu seperti Windows atau Office yang digunakan oleh jutaan orang di mana biaya pengecualian gelembung untuk pengguna sama sekali sudah sangat berbeda di tempat pertama.
On Error Resume Next
tidak dimungkinkan dalam C #. Setelah Exception
(C # tidak memiliki "kesalahan") Anda tidak bisa hanya melanjutkan dengan pernyataan berikutnya: eksekusi akan berlanjut di catch
blok - atau di salah satu penangan acara yang dijelaskan dalam jawaban di bawah ini.