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 #. SetelahException
(C # tidak memiliki "kesalahan") Anda tidak bisa hanya melanjutkan dengan pernyataan berikutnya: eksekusi akan berlanjut dicatch
blok - atau di salah satu penangan acara yang dijelaskan dalam jawaban di bawah ini.Jawaban:
Gunakan
Application.DispatcherUnhandledException Event
. Lihat pertanyaan ini untuk ringkasan (lihat jawaban Drew Noakes ' ).Ketahuilah bahwa masih ada pengecualian yang menghalangi kesuksesan melanjutkan aplikasi Anda, seperti setelah stack overflow, kehabisan memori, atau kehilangan konektivitas jaringan saat Anda mencoba menyimpan ke database.
sumber
Kode contoh menggunakan NLog yang akan menangkap pengecualian yang dilemparkan dari semua utas di AppDomain , dari utas pengirim UI dan dari fungsi async :
App.xaml.cs:
sumber
UnhandledException
pawang. Saya harus melihat Windows Event Log Viewer untuk menemukan apa yang terjadi ...e.Handled = true;
diUnhandledException
bahwa aplikasi tidak akan crash pada Pengecualian UIAppDomain. Event UncustomedException
sumber
Selain apa yang disebutkan orang lain di sini, perhatikan bahwa menggabungkan
Application.DispatcherUnhandledException
(dan sejenisnya ) dengandi
app.config
akan mencegah pengecualian utas sekunder Anda mematikan aplikasi.sumber
Berikut ini adalah contoh lengkap menggunakan
NLog
sumber
Seperti "VB's On Error Resume Next?" Kedengarannya agak menakutkan. Rekomendasi pertama adalah jangan lakukan itu. Rekomendasi kedua adalah jangan lakukan itu dan jangan pikirkan itu. Anda perlu mengisolasi kesalahan Anda dengan lebih baik. Mengenai cara mendekati masalah ini, itu tergantung pada bagaimana Anda menyusun kode. Jika Anda menggunakan pola seperti MVC atau sejenisnya maka ini seharusnya tidak terlalu sulit dan pasti tidak memerlukan penelepon pengecualian global. Kedua, cari perpustakaan logging yang bagus seperti log4net atau gunakan tracing. Kami perlu mengetahui detail lebih lanjut seperti apa pengecualian yang Anda bicarakan dan bagian mana dari aplikasi Anda yang dapat menyebabkan pengecualian dilemparkan.
sumber