2010-12-31 18 views
9

Yığın izleme/istisna bilgilerini eklemek istiyorum. Temelde ben gerçekten gibi bugün itibariyle böyle bir şey, varBir istisnayla ilgili bilgi ekleme

: Hala orijinal yığın yerken, o istisnayı yakalamak ve ona ek bilgi eklemek istiyorum Ancak

Exception in thread "main" java.lang.ArithmeticException:/by zero 
    at com.so.main(SO.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke 

iz.

Örneğin, ben o olsun isterim:

Exception in thread "main" CustomException:/by zero (you tried to divide 42 by 0) 
    at com.so.main(SO.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke 

Böylece temelde ekleyerek ArithmeticException ve rethrow, diyelim ki, bir customException (yakalamak istiyorum "0 olarak vasıtasıyla 42 bölmek için çalıştı" Bu örnekte, stacktrace'i orijinal ArithmeticException'dan hala korurken.

Java'da bunu yapmanın doğru yolu nedir?

try { 
    .... 
} catch (ArithmeticException e) { 
    throw new CustomException("You tried to divide " + x + " by " + y, e); 
} 
+0

Onu fırlatıp atmadıkça, istisnanın özelliklerini nasıl bilebilirdiniz? – Falmarri

+0

@Falmarri: Öznitelikleri bilmiyorum, ancak yöntem parametreleri gibi ek bilgiler ekleyebilirim. Sorumun sonunda bir örnek ekledim. – NoozNooz42

+0

Genellikle bu bilgi sadece hata ayıklama için kullanışlıdır. Programınızı ayıklamak ve istisna üzerine bir kesme noktası yerleştirmek için hata ayıklayıcısını kullanmayı da deneyebilirsiniz. İstisna atıldığında, ona neden olan koşulları göreceksiniz. –

cevap

11

Evet, yapabilirsiniz Java 1.4 itibarıyla Java böyle yuva istisnalar:

doğru takip mi. Bunu her zaman yaparım. Bakınız http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html.

Birisi, yığın izini özel kural dışı durumunuzdan yazdırdığında, hem CustomException yığın izlemesini hem de iç içe geçmiş ArithmeticException yığın yığınını gösterir. Keyfi olarak derinden yuva yapabilirsiniz.

+0

+1, çok teşekkürler. Uzun zamandır orada olduğunu görmek ilginç :) – NoozNooz42

+0

Link öldü [Üzgün ​​yüz] – meawoppl

10

Ayrıca yapabilirsiniz:

size verecekti
try { 
    .... 
} catch (ArithmeticException e) { 
    ArithmeticException ae = new ArithmeticException("You tried to divide " + x + " by " + y+" "+e.getMessage()); 
    ae.setStackTrace(e.getStackTrace()); 
    throw ae; 
} 

Güncelleme [27-Eylül-2012] :-) "görünmez" istisnalar: Java 7

: Başka havalı trick şudur:

try { 
    ... 
} catch (ArithmeticException e) { 
    e.addSuppressed(new ArithmeticException("You tried to divide " + x + " by " + y)); 
    throw e; 
} 
+0

+1 çok ... "Görünmez" tarafından, sadece bir yığın izi olacak, iki değil mi demek istiyorsunuz? – NoozNooz42

+1

Cevabınızı düzenleyemiyorum (Yeterli temsilcisi yok) ama sanırım ArithmeticException'ı oluşturduğunuz satırın sonunda çıkarmanız gereken * ", e" * kesip yapıştırarak/yapıştırdınız. – NoozNooz42

+0

Evet, sadece 1 stacktrace olacak. Ve hatayı fark ettiğiniz için teşekkürler. – Pat

İlgili konular