2015-12-10 16 views
5

GUI ve soket iletişimi ile çok küçük bir çoklu thread uygulamasına sahibim. Geliştirme sırasında bazen bazı istisnalarının yakalanmadığını ve günlüğüne kaydedilmediğini tespit ettim. Varsa onları almak için konsola bakmalıyım.Farklı iş parçacıklarından yakalanmamış tüm istisnaları geliştirme sırasında tek bir yerden nasıl yakalayabilirsiniz?

( (EDT dahil olmak üzere) farklı iş parçacıklarının yakalanmamış istisnalarını() dahil olmak üzere tek bir yerde söyleyerek yakalamanın bir yolu var mı? ana() ürününe Throwable ürününü yakalamak için bir deneme yapmalıyım ama işe yaramıyor.

DÜZENLEME:

, daha özel ben Runnable s Executors.newCachedThreadPool(). Birçok durumda Callable kullanmak istemiyorum çünkü arama iş parçacığı engellemek istemiyorum. O zaman bu Runnables'in istisnalarını nasıl yakalarım?

Ve ayrıca nasıl yakalanabileceği u EDTSalıncak ncaught istisna?

+0

gibi bir Thread.UncaughtExceptionHandler kullanın [Bu soru] (http://stackoverflow.com/questions/6546193/how-to-catch-an-exception-from-a-thread) – DaniEll

+1

uhm ... neden bunu "Callable" ın "iş parçacığı" nı engellediğini mi düşünüyorsun? Bu hiç bir anlam ifade etmiyor, sanki muzlar kendi zevkleri yüzünden küresel ısınmaya neden oluyor… ”Callable“ işlevsel bir arayüz ”ve birçok metot imzasına uygulanabiliyor - bu durumun blokaj işlemleri ile hiçbir ilgisi yok .. .. hiç. 'Callable' sadece arayanın thread kullanmazsa engeller - çalışabilir bir alışkanlık değişikliği için callable değişimini değiştirir. – specializt

cevap

6

Thread.setDefaultUncaughtExceptionHandler yöntemini kullanarak yakalanmayan istisnalar için UncaughtExceptionHandler türünde özel bir işleyici belirlemeyi öneririm. Bu işleyici, yakalanmamış bir istisna nedeniyle iş parçacığı sona ermek üzere olduğunda JVM tarafından çağrılacaktır.

Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable e) -> { 
      System.out.println(t + " throws exception: " + e); 
    }); 

UPD:

Salıncak EDT durumda gelince, güzel cevabı here olduğunu düşünüyorum.

+0

Bazı Konularım için çözümünüzü aldım. Ama ayrıca bir iş parçacığı havuzu ve Swing EDT var. Onları nasıl ele alırım? Lütfen düzenlememe bakın. – peterboston

-1

Büyük bir karmaşık programda basit bir sorun değil, çünkü farklı bir iş parçacığında bir özel durumun yakalanmasını sağlayan bir yöntem yoktur. Programdaki her iş parçacığının tüm özel durumları yakalayacak ve bunları rapor edecek bir işleyiciye sahip olduğundan emin olmanız gerekir.

Tüm iş parçacıklarını oluşturan kodu denetlerseniz, ancak sizin adınıza ileti dizileri oluşturan kitaplık rutinlerini çağırırsanız bu kadar kolay olur. Şansınız varsa, kütüphaneler bir ThreadFactory sağlamanıza izin verir, böylece kodunuzun yeni bir iş parçacığı oluşturduklarında kontrol kazanmasını sağlar.

Her iş parçacığının doğru şeyi yapan bir yakalanmamış özel durum işleyicisine sahip olduğundan emin olsanız bile, bir istisna yakalayan ve göz ardı eden bir yere (belki de aradığınız 3. parti kitaplığındaki) kodunuz olabilir. o.

İyi şanslar!

+1

thats .... sadece doğru değil. Size yabancı olan konular hakkında cevap yazmamanızı tavsiye ederim. İstisnalar çoğalır/kabarcıklar yapar ve aslında her şeyi yakalamak son derece kolaydır, soru altında ilk yorumu görürsünüz. – specializt

+2

@specializt Sizinki olmayan bir kod için "kabarcıklar" olduğunda bir istisna yakalamak o kadar kolay değildir ve sizin olmayan bir kodda yakalandığında ve yok sayıldığında bir istisna yakalamak o kadar kolay değildir. –

+0

, normal, benzersiz istisnalarla hiçbir ilgisi olmayan TAMAMEN farklı bir hikayedir. – specializt

İlgili konular