Pertanyaan Cara mudah untuk menangkap semua pengecualian yang tidak tertangani di C # .NET


Saya memiliki situs web yang dibangun di C # .NET yang cenderung menghasilkan aliran timeout SQL yang cukup stabil dari berbagai kontrol pengguna dan saya ingin dengan mudah memasukkan beberapa kode untuk menangkap semua pengecualian yang tidak tertangani dan mengirimnya ke sesuatu yang dapat mencatatnya dan menampilkan pesan ramah kepada pengguna.

Bagaimana saya, melalui upaya minimal, menangkap semua pengecualian yang tidak tertangani?

pertanyaan ini tampaknya mengatakan itu tidak mungkin, tapi itu tidak masuk akal bagi saya (dan ini tentang. NET 1.1 di aplikasi windows):


30
2017-11-17 14:49


asal


Jawaban:


Semua pengecualian yang tidak tertangani akhirnya melewati Application_Error di global.asax. Jadi, untuk memberikan pesan pengecualian umum atau melakukan operasi penebangan, lihat Aplikasi error.


26
2017-11-17 14:54



Jika Anda perlu menangkap exeptions di semua thread, pendekatan terbaik adalah mengimplementasikan UnhandledExceptionModule dan menambahkannya ke aplikasi Anda. sini  untuk sebuah contoh


16
2017-11-17 15:04



Gunakan metode Application_Error di file Global.asax Anda. Di dalam penerapan metode Application_Error Anda, panggil Server.GetLastError (), catat rincian pengecualian yang dikembalikan oleh Server.GetLastError () sesuai keinginan Anda.

misalnya

void Application_Error(object sender, EventArgs e) 
{ 
    // Code that runs when an unhandled error occurs
    log4net.ILog log = log4net.LogManager.GetLogger(typeof(object));
    using (log4net.NDC.Push(this.User.Identity.Name))
    {
        log.Fatal("Unhandled Exception", Server.GetLastError());
    }
}

Jangan terlalu memperhatikan hal-hal log4net, Server.GetLastError () adalah bit yang paling berguna, log rinciannya sesuka Anda.


13
2017-11-17 15:42



Itu Proyek ELMAH terdengar patut dicoba, daftar fiturnya meliputi:

ELMAH (Error Logging Module dan   Handler) adalah kesalahan aplikasi-lebar   fasilitas penebangan yang sepenuhnya   pluggable. Ini dapat ditambahkan secara dinamis   untuk menjalankan aplikasi web ASP.NET,   atau bahkan semua aplikasi web ASP.NET   di mesin, tanpa perlu   kompilasi ulang atau penyebaran ulang.

  • Penebangan hampir semua pengecualian yang tidak tertangani.
  • Halaman web untuk melihat secara jarak jauh seluruh log pengecualian rekoded.
  • Halaman web untuk melihat secara jarak jauh detail lengkap dari setiap orang yang masuk   pengecualian.
  • Dalam banyak kasus, Anda dapat meninjau layar kuning asli dari kematian itu   ASP.NET dihasilkan untuk diberikan   pengecualian, bahkan dengan mode customErrors   matikan.
  • Notifikasi e-mail tentang setiap kesalahan pada saat itu terjadi.
  • Umpan RSS dari 15 kesalahan terakhir dari log.
  • Sejumlah penerapan penyimpanan backing untuk log

Lebih lanjut tentang penggunaan ELMAH dari dotnetslackers


8
2017-11-17 16:17



Anda dapat berlangganan ke AppDomain.CurrentDomain.UnhandledException peristiwa.


7
2017-11-17 15:10



Mungkin penting untuk dicatat bahwa Anda tidak seharusnya untuk menangkap pengecualian yang tidak tertangani. Jika Anda mengalami masalah timeout SQL, Anda harus secara khusus menangkapnya.


3
2017-11-17 16:26



Apakah maksud Anda menanganinya di semua utas, termasuk yang dibuat oleh kode pihak ketiga? Dalam "dikenal" benang hanya menangkap Exception di bagian atas tumpukan.


2
2017-11-17 14:52



Saya akan merekomendasikan melihat log4net dan melihat apakah itu cocok untuk bagian penebangan dari pertanyaan.


1
2017-11-17 14:56