İstisnalar, faydalı ayrıntılar içermez çünkü istisnalar kavramı yazılım mühendisliği disiplini içinde henüz yeterince olgunlaşmamıştır, bu nedenle birçok programcı onları tam olarak anlamamaktadır ve bu nedenle onlara düzgün davranmamaktadır.
Evet, IndexOutOfRangeException
menzili dışında olan doğru dizini ve atıldığı sırada geçerli olan menzili içermelidir ve .NET çalışma zamanının oluşturucuları adına izin vermeyenler adına kabul edilemez. Evet, Oracle'ın table or view not found
istisnası, bulunamayan tablonun veya görüntünün adını içermeli ve yine, bundan kimin sorumlu olduğunu kabul etmemesi gerçeğini içermelidir.
Genel olarak, karışıklık, istisnaların insan tarafından okunabilir mesajlar içermesi gerektiği yönündeki yanlış yönlendirilmiş orijinal fikirden kaynaklanmaktadır;
İnsanlar istisnanın insan tarafından okunabilir bir mesaj içermesi gerektiğini düşündüklerinden, istisna tarafından taşınan her türlü bilginin aynı zamanda insan tarafından okunabilir mesaja da biçimlendirilmesi gerektiğine inanıyorlar ve sonra da insan tarafından okunabilen tüm mesajları yazmak için sıkılıyorlar. bina kodları, ya da bunu yapmaktan korkuyorlarsa, meraklı gözlerin mesajı görebilecekleri her ne olursa olsun, tavsiye edilemez miktarda bilgi açığa çıkaracaklarından korkuyorlar. (Diğer cevaplarda belirtilen güvenlik sorunları.)
Ama işin gerçeği istisna olmalıdır, çünkü onlar bu endişesi olmamalı ki değil bir insan tarafından okunabilir mesajı içerir. İstisnalar, yalnızca programcıların görmesi ve / veya başa çıkması gereken şeylerdir. Bir kullanıcıya arıza bilgisini sunma ihtiyacı varsa, çok yüksek bir seviyede, sofistike bir şekilde ve kullanıcının dilinde, istatistiksel olarak konuşması İngilizce olmayan bir dilde yapılmalıdır.
Bu nedenle, bizim için programcılar, istisnanın "mesajı" istisnanın sınıf adıdır ve istisnanın diğer bilgileri ne olursa olsun istisna nesnesinin (final / salt okunur) üye değişkenlerine kopyalanmalıdır. Tercihen, her bir düşünülen küçük bit. Bu şekilde, hiçbir mesajın üretilmesi gerekmez (ya da olmamalıdır) ve dolayısıyla meraklı gözler onu göremez.
Thomas Owens tarafından ifade edilen endişeyi aşağıdaki yorumda ele almak için:
Evet, tabii ki, bazı düzeyde, sen olacaktır istisna ile ilgili bir günlük mesajı oluşturmak. Ancak söylediklerinizle ilgili sorunu zaten görüyorsunuz: bir yandan, yığın izlemesiz bir istisna günlüğü mesajı kullanışsız, ancak diğer yandan, kullanıcının tüm istisna yığın izlemesini görmesine izin vermek istemiyorsunuz. Yine buradaki sorunumuz, perspektifimizin geleneksel uygulamalarla çarpıtılmış olmasıdır. Günlük dosyaları geleneksel olarak düz metin olmuştur, disiplimiz henüz başlangıç aşamasındayken iyi olabilirdi, ama belki de artık değil: bir güvenlik kaygısı varsa, o zaman günlük dosyasının ikili ve / veya şifreli olması gerekir.
İkili veya düz metin olsun, günlük dosyası, uygulamanın hata ayıklama bilgilerini seri hale getirdiği bir akış olarak düşünülmelidir. Böyle bir akış yalnızca programcıların gözünde olur ve bir istisna için hata ayıklama bilgisi oluşturma görevi, istisnayı hata ayıklama günlük akışına seri hale getirmek kadar basit olmalıdır. Bu şekilde, günlüğe bakarak, istisna sınıf adını (daha önce de belirttiğim gibi, tüm pratik amaçlar için "mesaj") göreceksiniz), istisna üye değişkenlerinin her birini tanımlayan her şeyi tanımlayan ve pratikte bir log-içine-dahil etmek ve tüm yığın iz. Bir insan tarafından okunabilir istisna mesajının biçimlendirme bariz nasıl Not eksik bu süreçten.
PS
Bu konudaki düşüncelerimden birkaçı bu cevapta bulunabilir: İyi bir istisna mesajı nasıl yazılır?
PPS
Birçok insan ikili günlük dosyaları hakkında benim öneri tarafından kapalı bilet ediliyordu görünür, bu yüzden ne Burada önerdiğim şey daha net olduğundan emin olmak için bir kez daha cevap değiştirilmiştir değil günlük dosyası olduğu gerektiğini ikili olabilir, ama bu günlük dosyası olabilir , gerekirse ikili olun.