Bazen görüyorum
try {
} catch(Throwable e) {
}
Ve bazen
try {
} catch(Exception e) {
}
Fark ne?
Bazen görüyorum
try {
} catch(Throwable e) {
}
Ve bazen
try {
} catch(Exception e) {
}
Fark ne?
Yanıtlar:
Yakalayarak Throwable
alt 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 .
throw new Throwable();
, bu yüzden her şeyi gerçekten yakalamanın tek yolu bu.
Birincisi, tüm alt sınıflarını yakalar Throwable
(buna Exception
ve içerir Error
), ikincisi ise tüm alt sınıflarını yakalar Exception
.
Error
programlı olarak hiçbir şekilde kurtarılamaz ve günlük tutma amaçları dışında (tekrar geçiren) genellikle yakalanamaz. Exception
programlı olarak kurtarılabilir. Alt sınıfı RuntimeException
bir programlama hatasını gösterir ve genellikle yakalanmayacaktır.
Error
ve 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
programmatically unrecoverable
Tam 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?
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.
Thowable
artı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 OutOfMemoryError
ve InternalError
veya 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.
Throwable
Exception
yanı 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, Error
ya da yakalamanız gerekir Throwable
.
Yerel bir kitaplığın yüklü olmadığını işaretlemek için Throwable'ı yakaladığımı hatırlıyorum.