Java'da Exception Anti-Pattern'leri
-
Upload
batuhan-bayrakci -
Category
Software
-
view
99 -
download
1
Transcript of Java'da Exception Anti-Pattern'leri
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 yazarthrow new MyServiceException(”ek bilgi", e);
}
Exception Fırlatmak• public void writeFile(String content) throws Exception
• Okunabilir ve bilgi verici değil
• Çağıran metoda nasıl davranması konusunda bilgivermiyor.
o Özel bir exception atarsa belki ona göre elealınacak. Örn: UnsupportedEncodingException atsakdaha özel önlemler alabiliriz.
public void writeFile(String content) throws FileNotFoundException gibi…
Ç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 olanexception’ları üst bir sınıfta toplamak.
o Örnek: IOException, giriş/çıkış ile ilgili birçokhatayı temsil eder.
• Metot parçalaması düşünülebilir.
Exception Yakalamak• catch (Exception e) {
• Bazı exception’lar için özel müdahale etmekisteyebiliriz. Ö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ı.
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ü.
null Dönmekcatch (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.
Yakalayıp Bırakmakcatch (IOException e) {}
• Checked bir exception’ı yakaladıktan sonra yoksaymak
• Önemli ki atılmış
• En azından unchecked’e çevirip göndermeli.
Finally içinde hata atmaktry {
foo();} finally {cleanUp(); exception atarsa
}
• finally içinde atılan exception yakalanmazsa foo()içerisinden atılan exception yok olur. Finally’denatılacak olası exception’ları ele almak faydalıolabilir.
• bkz. FileService#copyStreamToFile
Ardışık Log AtmakYanlış:
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.
Implement EdilmeyenMetotta 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?