Saya memiliki kode yang sedang login Exception.Message
. Namun, saya membaca sebuah artikel yang menyatakan bahwa lebih baik digunakan Exception.ToString()
. Dengan yang terakhir, Anda menyimpan informasi yang lebih penting tentang kesalahan.
Apakah ini benar, dan apakah aman untuk melanjutkan dan mengganti semua pencatatan kode Exception.Message
?
Saya juga menggunakan tata letak berbasis XML untuk log4net . Apakah Exception.ToString()
mungkin berisi karakter XML yang tidak valid, yang dapat menyebabkan masalah?
Jawaban:
Exception.Message
hanya berisi pesan (doh) yang terkait dengan pengecualian. Contoh:The
Exception.ToString()
metode akan memberikan yang jauh lebih verbose output, yang berisi jenis pengecualian, pesan (dari sebelumnya), jejak stack, dan semua hal ini lagi untuk bersarang / pengecualian batin. Lebih tepatnya, metode mengembalikan yang berikut:sumber
Selain apa yang sudah dikatakan, jangan gunakan
ToString()
pada objek pengecualian untuk ditampilkan kepada pengguna. HanyaMessage
properti yang cukup, atau pesan khusus tingkat yang lebih tinggi.Dalam hal tujuan logging, pasti digunakan
ToString()
pada Pengecualian, bukan hanyaMessage
properti, seperti dalam kebanyakan skenario, Anda akan dibiarkan menggaruk-garuk kepala Anda di mana pengecualian ini terjadi, dan apa tumpukan panggilan itu. Stacktrace akan memberitahumu semua itu.sumber
Mengubah Pengecualian SELURUH Menjadi String
Memanggil
Exception.ToString()
memberi Anda lebih banyak informasi daripada hanya menggunakanException.Message
properti. Namun, bahkan ini masih menyisakan banyak informasi, termasuk:Data
properti koleksi ditemukan pada semua pengecualian.Ada saatnya Anda ingin mengambil informasi tambahan ini. Kode di bawah ini menangani skenario di atas. Itu juga menulis properti pengecualian dalam urutan yang bagus. Ini menggunakan C # 7 tetapi harus sangat mudah bagi Anda untuk mengonversi ke versi yang lebih lama jika perlu. Lihat juga jawaban terkait ini .
Kiat Teratas - Pengecualian Pencatatan
Kebanyakan orang akan menggunakan kode ini untuk masuk. Pertimbangkan untuk menggunakan Serilog dengan paket Serilog saya. Eksepsi NuGet yang juga mencatat semua properti pengecualian tetapi melakukannya lebih cepat dan tanpa refleksi di sebagian besar kasus. Serilog adalah kerangka kerja logging yang sangat maju yang semuanya populer pada saat penulisan.
Tip Teratas - Jejak Tumpukan yang Dapat Dibaca Manusia
Anda dapat menggunakan paket Ben.Demystifier NuGet untuk mendapatkan jejak stack yang dapat dibaca manusia untuk pengecualian Anda atau paket NuGet yang diperkaya serilog-demistify jika Anda menggunakan Serilog.
sumber
Saya akan mengatakan @ Win benar. Anda harus menggunakan
ToString()
file log - dengan asumsi audiens teknis - danMessage
, jika sama sekali, untuk ditampilkan kepada pengguna. Orang bisa berpendapat bahwa itu pun tidak cocok untuk pengguna, untuk setiap jenis pengecualian dan kejadian di luar sana (pikirkan ArgumentExceptions, dll.).Selain itu, selain StackTrace,
ToString()
akan termasuk informasi yang tidak akan Anda dapatkan sebaliknya. Misalnya keluaran fusi, jika diaktifkan untuk memasukkan pesan log kecuali "pesan".Beberapa tipe pengecualian bahkan menyertakan informasi tambahan (misalnya dari properti khusus) di
ToString()
, tetapi tidak di dalam Pesan.sumber
Tergantung pada informasi yang Anda butuhkan. Untuk debugging jejak tumpukan & pengecualian dalam berguna:
sumber
Exception.ToString()
akan memberi Anda, kan?StringBuilder
dalam skenario ini mungkin lebih mahal daripada dua alokasi string baru, itu sangat bisa diperdebatkan akan lebih efisien di sini. Ini tidak seperti kita berurusan dengan iterasi. Kuda untuk kursus.Dalam hal format XML untuk log4net, Anda tidak perlu khawatir tentang ex.ToString () untuk log. Cukup lewati objek pengecualian itu sendiri dan log4net tidak memberi Anda semua detail dalam format XML pra-konfigurasi. Satu-satunya hal yang saya alami pada kesempatan adalah pemformatan baris baru, tetapi saat itulah saya membaca file mentah. Kalau tidak, parsing XML berfungsi dengan baik.
sumber
Yah, saya akan mengatakan itu tergantung apa yang ingin Anda lihat di log, bukan? Jika Anda puas dengan apa yang diberikan oleh ex.Message, gunakan itu. Jika tidak, gunakan ex.toString () atau bahkan catat jejak stack.
sumber