2009-01-26 18 views
6

Üçüncü taraf kitaplığından bir sınıftaki özel değişkene veri eklemek için yansıma kullanıyorum. Yol boyunca atılabilecek dört farklı istisna vardır; hepsi yansıma ile ilgilidir ve hepsinin ortaya çıkması pek olası değildir. İlgili sınıfın ve değişkenin adını kodluyorum. Kütüphane bir gün yükseltilmediyse ve önemli ölçüde değişmediyse, bulunamadı ya da bulunamayan herhangi bir sınıfı almam mümkün değil.Çeşitli istisnaları yakalamak ve genel bir istisnayı yeniden düşünmek

Arayanımın işlemesi için bu istisnaların dördünü beyan etmemeyi tercih ederim. Onları asla görmemesi muhtemeldir. Bunların hepsini yakalamayı ve "Bir Java yansıma hatası oluştuğunu; kütüphanenin bu yöntemle uyumsuz bir şekilde yükseltilmiş ve değiştirilmiş olması olasıdır" diye bir istisna atmak isterim. Sadece genel bir yansıma hatası olduğunu gösteren atabileceğim standart bir Java Exception var mı? Kendimi tanımlamalı mıyım? Ya da bu yöntemin tüm olası yansıma istisnalarını atabileceğini beyan etmek en iyisi olur mu?

cevap

2

Hiçbir zaman gerçekleşmesini beklemediğiniz takdirde, tüm Özel Durumları bir AssertionError'a dönüştürebilirsiniz. Belirli bir özel durumla uğraşmak isterseniz, InvocationTargetException açılabilir. Eğer bu hileyi kullanabilirsiniz ziyade InvocationTargetException daha yöntemle atılmış gerçek istisna istiyorum ama kullanışlı daha kafa karıştırıcı olabilir Eğer

} catch (InvocationTargetException e) { 
    // Throw any exception in the current thread (even if it is a checked exception) 
    Thread.currentThread().stop(e.getCause()); 
} 
+1

neden e.getCause()? Thread.stop() overkill ve kullanımdan kaldırıldı –

+1

Denediniz mi? e.getCause() bir Throwable döndürür. Bir ilan vermek zorunda kalmadan nasıl atıyorsunuz? –

6

Genellikle kendime bu soruları sorun:

  • kişiye bu yöntem farklı bu farklı istisna türü işlemek aramaları miyim?
  • ... Ya da hepsine aynı davranır mı?
  • Arayan/kullanıcı bu hatadan bile kurtulabilir mi?

çağıran kodu (kurtarılamaz bir hata gibi) aynı bu istisnaların dördünü tedavi olasılığı varsa, o zaman kesinlikle bunların her yakalamak ve daha genel (tek) özel durum atması mantıklı. Bunu yaparsanız, oluşturulan istisnayı diğer istisnada hata ayıklama veya sorun giderme işlemlerine yardımcı olmak için bir iç özel durum olarak eklediğinizden emin olun.

2

İşaretli ve denetlenmeyen istisnalar hakkında bazı tartışmalar var. Şahsen ben kontrol istisnalar Java en kötü fikir olduğunu düşünüyorum - ama bu sadece bir fikir (ancak bunu yalnız düşünmüyorum)

Neyse, önemli olan tek bir denetlenmeyen özel durum için bunları değiştirmek olurdu . Daha açık bir şekilde, IllegalStateException veya IllegalParameterException gibi tek bir tane kullanmama - açık bir metin açıklamasıyla, bu iki istisna, bir yöntemle yanlış gidebilecek bokun% 90'ını kapsamaktadır.

0

Bu durumda istisnaların açıklanmasının mantıklı olduğunu düşünmüyorum. Bu yüzden yansımalardan özel durumları yakalayabilirim, belki yığın izini kaydedebilir ve bildirilmesi gerekmeyen bir avantajı olan bazı RuntimeException'ları fırlatabilirim. Tembelseniz, RuntimeException'ı uygun bir mesajla kullanabilirsiniz.

2

Öncelikle, gerçekten, gerçekten yapmanız gerekmedikçe, yansıma kullanmayın çünkü kötülüktür. Varsayalım:

Tüm adları kodlarken, yalnızca Method.invoke, Constructor.newInstance ve Field.get/set'dan ayrılır. Error ile sarılmış olarak ele alabileceğiniz kontrol edilen istisnaları yeniden düzenlemenizi öneririm. Olmamalılar ve eğer bununla başa çıkmak istiyorsan, kontrol etmeyi sınıf intializasyon zamanında yapmayı öneriyorum. InvocationTargetException, elbette, istenmeyen bir şekilde ele alınmalı ve uygun bir şekilde ele alınmalıdır (yöntem/kurucunun bildirmediği kontrol edilen istisna için sarılmış bir atmalıdır).

1

Nasıl GeneralException ve catch uzanan bu durum sınıfları sahip hakkında o bu GeneralException?

Şimdi bunu deneyeceğim! :)

+0

Bu çok iyi çalışıyor! Umarım bu birisine sahip olduğunuz sıkıntıyı kurtarır! –

İlgili konular