java'da exception anti-pattern'leri

13
Java Exception Anti - Patterns Batuhan Bayrakçı

Upload: batuhan-bayrakci

Post on 22-Jan-2018

99 views

Category:

Software


1 download

TRANSCRIPT

JavaException

Anti-PatternsBatuhan Bayrakçı

İstisna Sınıfları

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?