3. Log’layıp Fırlatmak
• Gereksiz log’lama
• Tek bir hata için çok fazla mesaj
• İkisinden birisini yapabiliriz
• Örnek
catch (IOException e) {
logger.error(”Burada bir hata oluştu.", e);
throw e;
}
catch (NoSuchMethodException e) {
e.printStackTrace(); // System.err’e yazar
throw new MyServiceException(”ek bilgi", e);
}
4. Exception Fırlatmak
• public void writeFile(String content) throws Exception
• Okunabilir ve bilgi verici değil
• Çağıran metoda nasıl davranması konusunda bilgi
vermiyor.
o Özel bir exception atarsa belki ona göre ele
alınacak. Örn: UnsupportedEncodingException atsak
daha özel önlemler alabiliriz.
public void writeFile(String content) throws
FileNotFoundException gibi…
5. Çok Fazla Exception
Atmak
• public String convert(String source) throws
CharacterEncodingException, FileNotFoundException,
StreamException, DegisikBirException
• Okunabilirlik zorlaşır.
• Çağıranın ele alması daha zorlaşır.
• Öneri: Anlam olarak birleştirilebilir olan
exception’ları üst bir sınıfta toplamak.
o Örnek: IOException, giriş/çıkış ile ilgili birçok
hatayı temsil eder.
• Metot parçalaması düşünülebilir.
6. Exception Yakalamak
• catch (Exception e) {
• Bazı exception’lar için özel müdahale etmek
isteyebiliriz. Örn: Dosya hatasında SMS gönder gibi
• Yeni eklenen exception’lar görmezden gelinir.
• Bilgi verici log yazılamaz. // Bir hata oluştu.
• Olabildiğince özel istisnaları yakalamalı.
7. Stack Trace Kaybetmek
• Wrapping esnasında stack trace kaybetmemek lazım.
catch (FileNotFoundException e) {
throw new MySpecialFileException(e.getMessage());
}
• e nesnesinde barınan stack trace kayboldu. Business
support için çok kötü.
8. null Dönmek
catch (NoSuchMethodException e) {
logger.error(”bir hata oluştu", e);
return null;
}
• null dönmek normal akışın bir parçası
• İstisnai durum throw ile ifade edilir.
catch (NoSuchMethodException e) {
// Bir hata var ve yakalandı
return null;
}
• Istisna bilgileri yok oldu. Stack trace, mesaj vs.
9. Yakalayıp Bırakmak
catch (IOException e) {
}
• Checked bir exception’ı yakaladıktan sonra yoksaymak
• Önemli ki atılmış
• En azından unchecked’e çevirip göndermeli.
10. Finally içinde hata atmak
try {
foo();
} finally {
cleanUp(); exception atarsa
}
• finally içinde atılan exception yakalanmazsa foo()
içerisinden atılan exception yok olur. Finally’den
atılacak olası exception’ları ele almak faydalı
olabilir.
• bkz. FileService#copyStreamToFile
11. Ardışık Log Atmak
Yanlış:
logger.info("bu işlemi yaptım.");
logger.info("şu işlemi yaptım.");
Doğru:
logger.info("bu işlemi yaptım, şu işlemi yaptım");
• appServer’ın log’larını şişirir.
• Graylog’da yeni bir satır demek. Karmaşıklık.
• 1000 istek = 2000 satır mesaj. 1000’i gereksiz.
12. Implement Edilmeyen
Metotta Null Atmak
• Implement edilmeyecek metodları ifade ederken
@Override
public String search(String query) {
return null; // üst sınıftan gelen ve ihtiyaç olmayan metot.
}
@Override
public String createLine() {
throw new UnsupportedOperationException();
}
• Niyeti belli eden exception. Belirsiz NPE’den yeğdir.
• Alt sınıflar null’ı başka bir niyetle kullanıyorsa?