Try catch'te Throwable ve Exception kullanımı arasındaki fark


Yanıtlar:


247

Yakalayarak Throwablealt sınıf şeyler içerir Error. Bunu yapmak istememelisiniz, belki de bir iş parçacığının en yüksek "tümünü yakala" düzeyi dışında oturum açmak veya yanlış gidebilecek her şeyi kesinlikle ele almak dışında. Bilinmeyen kod çalıştırabileceği ve bu kodla ilgili yanlış giden herhangi bir şeyden etkilenmemesi gereken bir çerçeve tipi uygulamada (örneğin bir uygulama sunucusu veya bir test çerçevesi) daha tipik olacaktır .


30
Muhtemelen burada hiyerarşinin bir kısmını açıklamak en iyisidir.
Xonatron

11
Bu yanıtın bağlamı: Throwable, alt sınıflar olarak hem Hata hem de İstisna içerir, bu nedenle ilk deneme / yakalama ikinci ancak genel olarak aşırı kapsamlıdır.
Noel

2
Ayrıca Throwable'ın kullanıcı tanımlı doğrudan alt sınıflarını ve Throwable'ın örneklerini de içerir. Yazmanızı engelleyen hiçbir şey yok throw new Throwable();, bu yüzden her şeyi gerçekten yakalamanın tek yolu bu.
Antimon

3
Her ne kadar kabul edilmiş olsa da, bu soruya cevap vermiyor çünkü cevabın çoğu hem İstisna hem de Atılabilir'i yakalamak için en iyi uygulamayı anlatıyor ve soru farkla ilgiliydi (ne zaman istediğimi kullanacağımda olduğu gibi). Belirtilen tek fark "Alt sınıf Hatası olan şeyleri içerir" ve gerçekten kapsamlı bir yanıttır: Hata nedir? İçermesi neden önemlidir? Başka farklılıklar veya en iyi uygulamalar?
Oded Niv

@OdedNiv "Hata nedir? Neden içermesi önemlidir?" bunları başka bir soruda sorabilirsiniz.
Kronen

182

Birincisi, tüm alt sınıflarını yakalar Throwable(buna Exceptionve içerir Error), ikincisi ise tüm alt sınıflarını yakalar Exception.

Errorprogramlı olarak hiçbir şekilde kurtarılamaz ve günlük tutma amaçları dışında (tekrar geçiren) genellikle yakalanamaz. Exceptionprogramlı olarak kurtarılabilir. Alt sınıfı RuntimeExceptionbir programlama hatasını gösterir ve genellikle yakalanmayacaktır.


37
Şaşırtıcı bir şekilde, bu cevaptan 4 yıl sonra, çoğu "kod analizi" aracı hala atılabilir yakalamayı kritik bir hata olarak rapor edecektir . Günlük kaydı, Throwable'ı yakalamak için çok geçerli bir nedendir. Gelişmekte olan sunucuların yılları bana şunu söylüyor: 1) Kayıt almaya rağmen bir gerçekleşecek Errorve 2) Günlük kaydı olmadığı sürece, bir OOM'nin gerçekleştiğini asla bildiremeyebilirsiniz, bu da sunucunun neden "komik" davranmaya başladığını merak etmenize neden olmaz
Bruno Grieder

4
programmatically unrecoverableTam olarak ne demek? O kadar şiddetli mi, sonuç olarak JVM'den tahmin edilemeyen bir davranış elde etme şansı olmadan artık yakaladıktan sonra (günlük kaydı vb.) HERHANGİ BİR Java yöntemini çağıramayız?
Alexander Abakumov

Its subclass RuntimeException indicates a programming error: Bu ifadeye katılıp katılmadığımdan emin değilim. Bu doğruysa, beklenen tüm istisnaların istisnaların kontrol edilmesi gerektiği anlamına gelir. Bir şeyin başarısız olmasını ve başvurum tarafından kurtarılamaz olmasını beklersem, ancak en azından anlamlı bir istisna atmak isterim? Bu durumda işaretli bir istisna kullanmak işe yaramaz gibi görünür ve kaynak plakası oluşturur.
Nom1fan

22

Thowableartık kullanımdan kaldırılmış Thread.stop()yöntemden bir iş parçacığını durdurmak için varsayılan olarak atılan ThreadDeath bile her şeyi yakalar . Bu yüzden yakalayarak Throwable, en azından catch bloğunuzdan geçmeden try bloğundan asla ayrılmayacağınızdan emin olabilirsiniz, ancak OutOfMemoryErrorve InternalErrorveya StackOverflowError.

Yakalama Throwable, her türlü isteği dış koda devreden dış sunucu döngüleri için yararlıdır, ancak hizmeti canlı tutmak için hiçbir zaman sonlandırılmayabilir.


21

ThrowableExceptionyanı sıra süper sınıfıdır Error. Normal durumlarda, her zaman alt sınıflarını yakalamalıyız Exception, böylece kök neden kaybolmaz.

Sadece Java kodunuzu kontrol etmeyen şeylerin yanlış gitme olasılığını gördüğünüz özel durumlar, Errorya da yakalamanız gerekir Throwable.

Yerel bir kitaplığın yüklü olmadığını işaretlemek için Throwable'ı yakaladığımı hatırlıyorum.


0

İnsanların Infra başarısızlığı / bulunmaması nedeniyle meydana gelebilecek bazı hataları yakalamak için Throwable kullandığını gördüm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.