İstisnai şeyler, çok sık karşılaşmayı bekleyemeyeceğiniz şeyler, bir şeyin yanlış gittiğini gösteren şeyler için istisnalar kullanın. Örneğin, ağ kapalıysa, bir web sunucusu için olağanüstü bir şeydir. Veritabanı kullanılamıyorsa, bir şeylerin yanlış olduğu anlamına gelir. Yapılandırma dosyası eksikse, muhtemelen kullanıcının dosyaya bulaştığı anlamına gelir.
Yanlış kodu işlemek için istisnalar kullanmayın. Kodun doğruluğunu kontrol etmek için ya onaylamaları kullanmalısınız ya da .NET Framework 4 ve sonraki sürümlerinde Kod sözleşmeleri (iddiaların yerini alan ve ek, özellikle değerli özelliklere sahip).
İstisnai olmayan durumlarda istisna kullanmayın. Kullanıcının bir sayı girmesi istendiğinde, "köpek" girmesi bir istisnayı hak edecek kadar istisnai değildir.
İstisna türlerini seçerken dikkatli olun. Gerektiğinde kendi tiplerinizi oluşturun. Ebeveynleri yakalamanın çocukları da yakalayacağını akılda tutarak kalıtımı dikkatlice seçin. Asla throw Exception
.
Hatalar için dönüş kodlarını kullanmayın. Hata kodları kolayca maskelenir, yoksayılır, unutulur. Bir hata varsa, ya onu tutun ya da üst yığına geçirin.
Bir yöntemin bir hata döndürmesi beklenen ve hatanın istisnai olmadığı durumlarda, numaralandırmaları kullanın, asla hata numaralarını kullanmayın. Misal:
// Note that the operation fails pretty often, since it deals with the servers which are
// frequently unavailable, and the ones which send garbage instead of the actual data.
private LoadOperationResult LoadProductsFromWeb()
{
...
}
Anlamı LoadOperationResult.ServerUnavailable
, LoadOperationResult.ParsingError
veri ayrıştırılamaz olduğunu - vs. o kod sunucusu kapalı olduğunu 12 aracı ve kod 13 hatırlayarak, demek, çok daha açık olduğunu.
Belirli bir alanda çalışan her geliştirici tarafından bilinen yaygın kodlara başvururken hata kodlarını kullanın. Örneğin, HTTP 404 Bulunamadı veya HTTP 500 Dahili Sunucu Hatası için bir enum değeri yeniden yaratmayın.
Boolelara dikkat edin. Er ya da geç, sadece belirli bir yöntemin başarılı olup olmadığını değil, nedenini bilmek isteyeceksiniz. İstisnalar ve sıralamalar bunun için çok daha güçlüdür.
Her istisnayı yakalamayın (yığının en üstünde değilseniz). Bir istisna yakalarsanız, bunu ele almaya hazır olmalısınız. Her şeyi yakalamak, kodunuzun doğru çalışıp çalışmadığını umursamadığınızı gösterir. Bu, "Şu anda nasıl düzeltileceğini aramak istemiyorum" u çözebilir, ancak er ya da geç size zarar verir.
C # 'da, böyle istisnaları asla tekrar etmeyin:
catch (SomeException ex)
{
...
throw ex;
}
çünkü yığını kırıyorsun. Bunun yerine şunu yapın:
catch (SomeException)
{
...
throw;
}
İstisna mesajları yazarken çaba gösterin. Kaç kere throw Exception("wrong data")
ya da gibi bir şey gördüm throw Exception("shouldn't call this method in this context")
. Altı ay sonra kendiniz de dahil olmak üzere diğer geliştiriciler, hangi verilerin yanlış olduğunu ve neden veya neden bir bağlamda bir yöntem dememeliyiz veya tam olarak hangi bağlamı bilmememiz gerektiğini bilemezler.
İstisna mesajlarını kullanıcıya gösterme. Sıradan insanlar için beklenmezler ve genellikle geliştiricilerin kendileri için bile okunamazlar.
İstisna mesajlarını yerelleştirmeyin. Yerelleştirilmiş bir iletinin belgelerinde arama yorucu ve anlamsızdır: her iletinin yalnızca İngilizce ve İngilizce olması gerekir.
Sadece istisnalara ve hatalara odaklanmayın: kayıtlar da son derece önemlidir.
.NET'te, yöntemin XML belgelerine istisnalar eklemeyi unutmayın:
/// <exception cref="MyException">Description of the exception</exception>
XML belgelerine istisnalar eklemek, kitaplığı kullanan kişi için işleri çok daha kolaylaştırır. Hangi istisnanın bir yöntemle ve neden atılabileceğini tahmin etmeye çalışmaktan daha can sıkıcı bir şey yoktur.
Bu anlamda, Java istisna yönetimi daha katı ve daha iyi bir yaklaşım sağlar. Sizi, çağrılan yöntemlerle potansiyel olarak atılan istisnalarla uğraşmaya zorlar veya kendi yönteminizde, işlemediğiniz istisnaları atabileceğini ve özellikle şeffaf hale getireceğini beyan eder.