SlideShare a Scribd company logo
1 of 13
Java
Exception
Anti-Patterns
Batuhan 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 yazar
throw 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 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…
Ç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.
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ı.
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ö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.
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.
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
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.
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?
Java'da Exception Anti-Pattern'leri

More Related Content

Viewers also liked

Lý trần tình hận
Lý trần tình hậnLý trần tình hận
Lý trần tình hậnhannguyenhuu
 
Deutschland
DeutschlandDeutschland
Deutschlandgiannakf
 
презентация1
презентация1презентация1
презентация1Agaev Shahin
 
Python ilə Proqramlaşdırma Kitabı - TƏQDİMAT
Python ilə Proqramlaşdırma Kitabı - TƏQDİMATPython ilə Proqramlaşdırma Kitabı - TƏQDİMAT
Python ilə Proqramlaşdırma Kitabı - TƏQDİMATKarim Tahiroglu
 
Capture The Flag - Azerbaijan
Capture The Flag - AzerbaijanCapture The Flag - Azerbaijan
Capture The Flag - AzerbaijanRashad Aliyev
 
Distant təhsil -Elektron tehsil
Distant təhsil -Elektron tehsilDistant təhsil -Elektron tehsil
Distant təhsil -Elektron tehsilAzer Hesenzade
 
DSpace Rəqəmsal Kitabxanası
DSpace Rəqəmsal KitabxanasıDSpace Rəqəmsal Kitabxanası
DSpace Rəqəmsal KitabxanasıIltifat Ibrahimov
 
Obyekt yönümlü proqramlaşdırma
Obyekt yönümlü proqramlaşdırmaObyekt yönümlü proqramlaşdırma
Obyekt yönümlü proqramlaşdırmaS H
 
International Logistics - Beynəlxalq logistika (in Azerbaijani language)
International Logistics - Beynəlxalq logistika (in Azerbaijani language) International Logistics - Beynəlxalq logistika (in Azerbaijani language)
International Logistics - Beynəlxalq logistika (in Azerbaijani language) Tamraz Hamidov
 

Viewers also liked (13)

Fun at ncr
Fun at ncrFun at ncr
Fun at ncr
 
Lý trần tình hận
Lý trần tình hậnLý trần tình hận
Lý trần tình hận
 
Deutschland
DeutschlandDeutschland
Deutschland
 
презентация1
презентация1презентация1
презентация1
 
İmtahan sistemi
İmtahan sistemiİmtahan sistemi
İmtahan sistemi
 
Hemorragia Digestiva Baixa
Hemorragia Digestiva BaixaHemorragia Digestiva Baixa
Hemorragia Digestiva Baixa
 
Python ilə Proqramlaşdırma Kitabı - TƏQDİMAT
Python ilə Proqramlaşdırma Kitabı - TƏQDİMATPython ilə Proqramlaşdırma Kitabı - TƏQDİMAT
Python ilə Proqramlaşdırma Kitabı - TƏQDİMAT
 
Oop concepts
Oop conceptsOop concepts
Oop concepts
 
Capture The Flag - Azerbaijan
Capture The Flag - AzerbaijanCapture The Flag - Azerbaijan
Capture The Flag - Azerbaijan
 
Distant təhsil -Elektron tehsil
Distant təhsil -Elektron tehsilDistant təhsil -Elektron tehsil
Distant təhsil -Elektron tehsil
 
DSpace Rəqəmsal Kitabxanası
DSpace Rəqəmsal KitabxanasıDSpace Rəqəmsal Kitabxanası
DSpace Rəqəmsal Kitabxanası
 
Obyekt yönümlü proqramlaşdırma
Obyekt yönümlü proqramlaşdırmaObyekt yönümlü proqramlaşdırma
Obyekt yönümlü proqramlaşdırma
 
International Logistics - Beynəlxalq logistika (in Azerbaijani language)
International Logistics - Beynəlxalq logistika (in Azerbaijani language) International Logistics - Beynəlxalq logistika (in Azerbaijani language)
International Logistics - Beynəlxalq logistika (in Azerbaijani language)
 

Java'da Exception Anti-Pattern'leri

  • 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?