Ben java.sql.Connection kapatırken atılan istisnalar yakalamak mı

oy
13

Connection.close()atabilir SqlException, ama ben her zaman bu tür istisnalar görmezden güvenli olduğunu varsaydım (ve onları görmezden gelmez kod görmedim).

Normalde yazardım:

 try{
    connection.close();
 }catch(Exception e) {}

Veya

 try{
    connection.close();
 }catch(Exception e) {
     logger.log(e.getMessage(), e); 
 }

Soru:

  1. Kötü bir uygulama mı (ve bu tür istisnalar göz ardı zaman kimse sorunları vardı vardır).
  2. Ne zaman Connection.close()herhangi bir özel durum oluşturur.
  3. o kötüyse nasıl istisna işlemesi gerekir.

Yorum Yap:

İstisna atmanın kötü olduğunu biliyorum, ama bir bağlantı kapatırken atılan istisnalar sadece reffering ediyorum (ve ben gördüm bu bu durumda oldukça yaygındır).

Herkes ne zaman biliyor mu Connection.close()şey atmak olabilir?

Oluştur 29/10/2008 saat 20:43
kaynak kullanıcı
Diğer dillerde...                            


12 cevaplar

oy
12

Genel olarak, ben böyle istisnalar atmadan insanlar tarafından boşa gün yaşadım.

Ben istisnalar dışında birkaç temel kurallarını uygulayarak tavsiye:

Eğer bir kontrol hariç bir soruna neden ASLA KESİNLİKLE EMİN ise, SADECE o istisnayı yakalamak ve bunu işlemek gerek yok tam olarak neden açıklama. (Uyku aslında bunun ilgilenen sürece daima göz ardı edilebilir bir InterruptedException atıyor, ama dürüstçe bu genellikle göz ardı sadece durumdur? - Bunu yaptıktan maliyeti nedir, bunu asla eğer, hatta en)

Emin değilseniz, ancak bazen bunu elde yakalamak ve bir soruna neden olup olmadığını o, o bulunabilir sadece bu yüzden bir yığın izleme günlüğe edin. Yine, gereken tek istisna yakalamak.

Eğer kontrol istisna atılabilir herhangi bir şekilde göremiyorsanız, yakalamak ve denetlenmeyen istisna olarak yeniden atmak.

Ne istisna neden olduğunu tam olarak biliyorsanız, bunu yakalamak ve siz olarak çok açık ise, gerçekten bu durumda bir yığın izleme gerekmez tam olarak neden log buna neyin sebep olduğunu (ve eğer giriş ediyor sınıfını bahsedebilirim zaten log4j falan kullanmıyoruz.

Bu senin sorunun, son kategoriye girer gibi geliyor ve bir av bu tür, her zaman (kötü parametreler, boş gösterici ihtimale bazı kontrolsüz istisnası atılır belirli istisna yapmak, siz (İstisna e) yazdıklarını asla ...)

Güncelleme: Burada asıl sorun İşaretli İstisnalar ungood olmasıdır. Onlar var sadece yüksek kullanılan dil Java olduğunu. Onlar teoride düzgün, ancak eylem onlar yakalama bu davranışa neden ve işaretlenmemiş istisnalarla alamadım gizlemek.

Birçok insan onları gizleme bazen tamam olduğunu söyledi gerçeği yorumladı. spesifik olmak gerekirse, aklıma gelen bir durumdur:

try {
    Thread.sleep(1000);
catch (InterruptedException e) {
    // I really don't care if this sleep is interrupted!
}

Bunun bir istisnası koşulunu belirten daha bir uykunun sonuçlarını bildiren oluyor, InterruptedException bu kullanımı ilk etapta kontrol istisna modeliyle kötüye çünkü bu kullanım tamamdır hissetmek ana nedeni olduğunu varsayalım.

Bu sahip olmak çok daha mantıklı olurdu:

boolean interrupted=Thread.sleep(1000);

ilk Java oluştururken Ama (anlaşılır yüzden, bu kavramın içinde gerçekten temiz - sadece pratikte başarısız) yeni kontrol istisna modeliyle çok gurur

Ben bu kabul edilebilir bir kasa daha hayal edemiyorum, bu yüzden belki de bu listede olması gereken bir istisna görmezden geçerli olabilir tek durumda.

Cevap 29/10/2008 saat 20:49
kaynak kullanıcı

oy
11

Aslında, ne yaptığınızı burada (neredeyse) en iyi uygulama :-) ben Bahar 'JdbcUtils.java gördüklerini tek şey. Yani, başka bir catch bloğu eklemek isteyebilirsiniz.

/**
 * Close the given  ResultSet and ignore any thrown exception.
 * This is useful for typical finally blocks in manual  code.
 * @param resultSet the  ResultSet to close
 * @see javax.resource.cci.ResultSet#close()
 */
private void closeResultSet(ResultSet resultSet) {
  if (resultSet != null) {
    try {
      resultSet.close();
    }
    catch (SQLException ex) {
      logger.debug("Could not close  ResultSet", ex);
    }
    catch (Throwable ex) {
      // We don't trust the  driver: It might throw RuntimeException or Error.
      logger.debug("Unexpected exception on closing  ResultSet", ex);
    }
  }
}
Cevap 30/10/2008 saat 03:52
kaynak kullanıcı

oy
6

Asgari düzeyde her zaman her zaman sen yakalamak ve üzerinde hareket etmez istisnalar açın.

ufak dikizlemek yutulur Sessizce yakalandı istisnalar kötüsü.

Cevap 30/10/2008 saat 01:32
kaynak kullanıcı

oy
3

Ben şahsen en az hata günlüğü senin ikinci fikir gibi. Eğer İstisna yakalamak Çünkü, bir SQL İstisna dışında bir şey yakalamak için teorik olarak mümkün. Ben neler olabileceğini emin değilim ya da ne kadar nadir ama tüm hataları baskı altına bana doğru görünmüyor (bellek istisnalar, vb dışına gibi).

Hataları bastırmak istiyorsanız, sadece bu şekilde ele alınmalıdır biliyorum çok özel olanları yapardı.

Hypothecial durum: sql açık bir hareketi vardı ve bağlantı kapama, bundan dolayı bir exceptino neden bu hatayı bastırmak istiyorum ne olur? Hatta baskılayan SQLExceptions biraz tehlikeli olabilir.

Cevap 29/10/2008 saat 20:51
kaynak kullanıcı

oy
1

Not Apache Commons DbUtils bir sağlar closeQuietly()size 'gereksiz' yakalar kodunuzu dağınık olmaması için kullanabileceğiniz, yöntem. Ben yutma istisnaları savunan değilim Not, ancak bunun için close()senaryo ben genellikle kabul edilir düşünüyorum.

Cevap 09/03/2009 saat 15:26
kaynak kullanıcı

oy
1

Ayrıca RuntimeException atabilseydin:

try {
    connection.close();
 } catch(Exception e) {
     throw new RuntimeException(e); 
 }

Eğer yöntem imzası değiştirmek zorunda olmayacak ve sorunun nedenini bulmak için daha sonra Exception.getCause yöntemi kullanmak mümkün olacak.

Cevap 30/10/2008 saat 02:39
kaynak kullanıcı

oy
1

) İdeal bir dünyada, sen, elbette, bir istisna ile ilgili hiçbir şey asla ideal bir dünyada, bir özel durumu ya 8- olsun asla

Yani, çeşitli seçeneklerin etkilerini incelemek gerekir.

Sadece Log: Veritabanı işlemleri işi bitmiş, hiçbir şey yapmak ama kaynakları temizlemek için sol vardır. Bir istisna bu noktada oluşursa, büyük olasılıkla yapılan işin üzerinde bir etkisi yoktur, bu nedenle hata günlüğü yeterli olacaktır. Bir hata giriş sırasında oluşursa Elbette, o zaman temelde aslında başarısız olmamış başarısız veritabanı işlemi işlemek zorunda.

Boş işleyicisi: Veritabanı işlemleri işi bitmiş, hiçbir şey yapmak ama kaynakları temizlemek için sol vardır. Bir istisna bu noktada oluşursa, büyük olasılıkla yapılan işin üzerinde bir etkisi yoktur, bu nedenle yöntemi başarıyla döndürür. Bir sonraki veritabanı erişimi aynı sorun haline çalıştırmak olabilir, ama o haklı olarak uygun şekilde ele almak, sonra başarısız olacak ve bir işlemin, başlangıcında gerçekleşmelidir. Sorunun kendi kendine sabit ise, o zaman bir şey bugüne kadar yanlış gittiğini hiçbir gösterge olacaktır.

Sonunda biz başka başarısızlıklar kaynak temizleme inhibe etmek istemiyorum çünkü o temizleme oluşur sağlamak için blok bir bir close () operasyonu (lar) koymak için oldukça tipik senaryodur. Hiçbir Hata yoksa kendi işlem başarıyla tamamlandığında, sonra yöntem başarısız olmamalıdır. Bu durumda, boş istisna işleme oldukça normaldir.

Tabii görüşler değişecektir.

Cevap 29/10/2008 saat 22:03
kaynak kullanıcı

oy
1

Sen istisna başa çıkmak zorundadır. Kötü bir uygulama değildir. Sadece dabatase bağlantıyı kapatmadan önce ağ kaybetti düşünün. Muhtemelen özel durum oluşturur.

nadir mı? Evet. Ben onlar istisna denir ve bu kadar görmezden bir neden değildir ne varsayalım. başarısız olsaydı, o başarısız olacağını unutmayın.

Ayrıca noktada boş bir bağlantı olması mümkün olup olmadığını düşünmesi gereken (bir NullPointerException neden olur) ya da değil.

if (connection != null) {
   try { 
      connection.close(); 
   } catch (SQLException sqle) { 
      logger.log(e.getMessage(), e); 
   }
}
Cevap 29/10/2008 saat 21:02
kaynak kullanıcı

oy
0

Onun daha iyi bir uygulama veritabanına bağlantıyı kapatmadan sırasında özel durum işlenecek. Eğer deyimi veya resultset nesnelere erişmek çalışıyorsanız, Çünkü kodunuzda zaman sonra bir noktada, o zaman otomatik olarak bir istisna yükseltecektir. Yani, daha iyi durum işlenecek.

Cevap 22/09/2012 saat 14:16
kaynak kullanıcı

oy
0

Bunu işleyebilir, o zaman bunu (ve beklenmedik eğer log). Bununla başa yapamıyorsanız yukarıda bazı kod hallederim öyleyse, o zaman düzgün rethrow.

Sessizce kodu düzeltmek için kişinin önemli bilgileri dışarıda bırakarak istisnaları olduğu yutma.

Cevap 04/04/2010 saat 11:04
kaynak kullanıcı

oy
0

Bu bir "hiçbir zaman olur hata" ise durum o zaman sadece bir özel durum rethrow ve kimse onu yakalar umut olacak.
bu başka bir durum buysa ben muhtemelen bunu günlüğe kaydeder

Cevap 30/10/2008 saat 02:21
kaynak kullanıcı

oy
0

Bir istisna görmezden Benim deneyim iyi bir fikir değildir. Eğer istisna açmış bana, eğer üretim destek mühendisleri ve analistler size bir ton teşekkür edecek inan.

Doğru Günlüğü çerçevesini kullanıyorsanız Ayrıca, istisna sıfır veya minimal performans etkisi olmaz.

Cevap 29/10/2008 saat 21:07
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more