Bagaimana cara menangkap semua pengecualian tidak tertangani yang terjadi di ASP.NET Web Api sehingga saya bisa mencatatnya?
Sejauh ini saya sudah mencoba:
- Buat dan daftarkan
ExceptionHandlingAttribute
- Terapkan
Application_Error
metode diGlobal.asax.cs
- Berlangganan
AppDomain.CurrentDomain.UnhandledException
- Berlangganan
TaskScheduler.UnobservedTaskException
The ExceptionHandlingAttribute
berhasil menangani pengecualian yang dilemparkan dalam metode aksi controller dan filter tindakan, tetapi pengecualian lainnya tidak ditangani, misalnya:
- Pengecualian dilempar ketika
IQueryable
dikembalikan oleh metode tindakan gagal dijalankan - Pengecualian dilemparkan oleh penangan pesan (yaitu
HttpConfiguration.MessageHandlers
) - Pengecualian diberikan saat membuat instance pengontrol
Pada dasarnya, jika pengecualian akan menyebabkan 500 Internal Server Error dikembalikan ke klien, saya ingin itu masuk. Menerapkan Application_Error
melakukan pekerjaan ini dengan baik di Formulir Web dan MVC - apa yang dapat saya gunakan di Api Web?
c#
asp.net-web-api
unhandled-exception
Joe Daley
sumber
sumber
Jawaban:
Ini sekarang dimungkinkan dengan WebAPI 2.1 (lihat Yang Baru ):
Buat satu atau beberapa implementasi IExceptionLogger. Sebagai contoh:
Kemudian daftarkan dengan HttpConfiguration aplikasi Anda, di dalam config callback seperti ini:
atau secara langsung:
sumber
Jawaban Yuval adalah untuk menyesuaikan tanggapan untuk pengecualian yang tidak tertangani yang ditangkap oleh API Web, bukan untuk pencatatan, seperti yang dicatat di halaman tertaut . Lihat bagian Kapan Menggunakan di halaman untuk detailnya. Logger selalu dipanggil tapi handler dipanggil hanya jika respon bisa dikirim. Singkatnya, gunakan pencatat untuk mencatat dan penangan untuk menyesuaikan respons.
By the way, saya menggunakan v5.2.3 assembly dan
ExceptionHandler
kelas tidak memilikiHandleCore
metode. Setara, menurut saya, adalahHandle
. Namun, subclass sajaExceptionHandler
(seperti dalam jawaban Yuval) tidak akan berhasil. Dalam kasus saya, saya harus menerapkanIExceptionHandler
sebagai berikut.Perhatikan bahwa, tidak seperti logger, Anda mendaftarkan penangan Anda dengan mengganti penangan default, bukan menambahkan.
sumber
Untuk menjawab pertanyaan saya sendiri, ini tidak mungkin!
Menangani semua pengecualian yang menyebabkan kesalahan server internal tampaknya seperti kemampuan dasar yang harus dimiliki API Web, jadi saya telah mengajukan permintaan dengan Microsoft untuk penanganan kesalahan global untuk API Web :
https://aspnetwebstack.codeplex.com/workitem/1001
Jika Anda setuju, buka tautan itu dan pilih!
Sementara itu, artikel bagus Penanganan Pengecualian API Web ASP.NET menunjukkan beberapa cara berbeda untuk menangkap beberapa kategori kesalahan yang berbeda. Ini lebih rumit dari yang seharusnya, dan tidak menangkap semua kesalahan server antar, tetapi ini adalah pendekatan terbaik yang tersedia saat ini.
Pembaruan: Penanganan kesalahan global sekarang diterapkan dan tersedia dalam versi malam! Ini akan dirilis di ASP.NET MVC v5.1. Begini cara kerjanya: https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling
sumber
Anda juga dapat membuat penangan pengecualian global dengan mengimplementasikan
IExceptionHandler
antarmuka (atau mewarisiExceptionHandler
kelas dasar). Ini akan menjadi yang terakhir dipanggil dalam rantai eksekusi, setelah semua terdaftarIExceptionLogger
:Lebih lanjut tentang itu di sini .
sumber
Anda mungkin memiliki blok coba-tangkap yang tidak Anda sadari.
Saya pikir
global.asax.Application_Error
metode baru saya tidak secara konsisten dipanggil untuk pengecualian yang tidak tertangani dalam kode lama kami.Kemudian saya menemukan beberapa blok coba-tangkap di tengah tumpukan panggilan yang disebut teks Respon.Write on the Exception. Itu dia. Menghapus teks di layar lalu membunuh batu pengecualian itu.
Jadi pengecualian sudah ditangani, tetapi penanganannya tidak berguna. Setelah saya menghapus blok coba-tangkap itu, pengecualian disebarkan ke metode Application_Error seperti yang diharapkan.
sumber