İstisna yönetimi için aklınızda bulundurmanız gereken birkaç kural vardır. Ancak önce, istisnaların kod tarafından maruz kalan arayüzün bir parçası olduğunu hatırlamanız gerekir ; belgelemek . Arayüz genel bir arayüz olduğunda bu özellikle önemlidir, ancak özel arayüzlerde de çok iyi bir fikirdir.
İstisnalar, yalnızca kodun kendileriyle mantıklı bir şey yapabileceği noktada ele alınmalıdır. En kötü kullanım seçeneği, sadece tam olarak doğru seçenek olduğunda yapılması gereken onlar hakkında hiçbir şey yapmamaktır. (Kodumda böyle bir durum olduğunda, bu etki için bir yorum ekledim, bu yüzden boş gövde hakkında endişelenmemeyi biliyorum.)
İkinci en kötü seçenek, orijinal neden olarak eklenmeden ilgisiz bir istisna atmaktır. Buradaki sorun, orijinal istisna dahilinde sorunun teşhisine izin verecek bilgilerin kaybolmasıdır; hiç kimsenin bir şey yapamayacağı bir şey yaratıyorsunuz (“işe yaramadığından şikayet etmek dışında, hepimiz bu hata raporlarından nasıl nefret ettiğimizi biliyoruz ).
Çok daha iyi istisna günlüğü. Bu, birisinin sorunun ne olduğunu öğrenmesine ve düzeltmesine izin verir, ancak istisnayı yalnızca harici bir bağlantı üzerinden başka türlü kaybolacağı veya rapor edileceği noktada günlüğe kaydetmelisiniz. Bunun nedeni, daha sık oturum açmanın bu kadar önemli bir sorun olması değil, daha çok günlük tutmanın, daha fazla bilgi içermeden günlüğün daha fazla yer kaplaması anlamına gelmesidir. İstisna kaydolduktan sonra, kısa versiyonun eşleşebilmesi için bu raporda iyi bir vicdanla kullanıcı / müşteriye bir bildirim bildirebilirsiniz (üretim zamanını veya başka bir korelasyon tanımlayıcısını da eklediğiniz sürece) gerekirse detay ile).
En iyi seçenek, elbette, istisnayı tamamen ele almak ve hata durumunun tamamını ele almaktır. Bunu yapabilirseniz, elbette yapın! Hatta istisnayı günlüğe kaydetmekten kaçınabileceğiniz anlamına da gelebilir.
Bir istisnayı ele almanın bir yolu, sorunun daha üst düzey bir tanımını sağlayan başka bir istisna atmaktır (örneğin, “ failed to initialize
” yerine “ index out of bounds
”). İstisnanın nedeni hakkındaki bilgileri kaybetmediğiniz sürece bu iyi bir modeldir; cause
üst düzey istisnayı başlatmak veya ayrıntıyı günlüğe kaydetmek için ayrıntılı istisnayı kullanın (yukarıda tartışıldığı gibi). IPC çağrısı gibi süreçler arası bir sınırı geçmek üzereyken günlüğe kaydetme en uygun yöntemdir, çünkü bağlantının diğer ucunda düşük düzey özel durum sınıfının bulunacağının garantisi yoktur. Dahili bir sınırı geçerken ekli neden olarak tutmak en uygunudur.
Gördüğünüz başka bir desen, yakala ve bırak:
try {
// ...
} catch (FooException e) {
throw e;
}
Bu, istisnaların kendi başına geçmesine izin veremeyeceğiniz anlamına gelen diğer maddelerden tür kısıtlamalarınız yoksa , bir anti-desendir catch
. Sonra sadece Java'nın çirkin bir özelliği.
Eğer olması dışında kontrol istisnalar ve kontrolsüz olanlar arasındaki gerçek fark yok yok zorundadır işaretli istisnalar o cross yöntemi sınırları beyan ederim. @throws
Kodunuz tarafından kasıtlı olarak atıldıklarını biliyorsanız , kontrol edilmeyen istisnaları ( javadoc yorumuyla) belgelemek hala iyi bir fikirdir . Kasıtlı olarak java.lang.Error
veya alt sınıflarını atmayın (bir JVM uygulaması yazmıyorsanız).
Görüş: Beklenmeyen bir hata durumu her zaman kodunuzdaki bir hatayı temsil eder. İşaretli istisnalar bu tehdidi yönetmenin bir yoludur ve geliştiricilerin kasıtlı olarak hata durumlarını ele alma sorununu önlemenin bir yolu olarak kontrol edilmeyen istisnaları kullandıkları yerlerde, bir süre temizlemek zorunda kalacak çok fazla teknik borç oluşturuyorsunuz. sağlam bir kod istiyorsanız. Özensiz hata işleme profesyonelce (ve hata işlemeye bakmak, bir programcının gerçekten ne kadar iyi olduğunu belirlemenin iyi bir yoludur).