FooException
ile çalışıyorum ve BarException
oluşuyor varsayalım. Her ikisi de denetlenmeyen istisnalar olduklarını varsayalım.Diğer istisnaları kullanırken atılan istisnalar için doğru şekilde zincirlenmiş yığın izi nasıl edinilir?
Ne stacktrace görmek istiyorum geçerli:
com.bar.BarException: Bar Message
at com.baz.BazCode(BazCode.java:123)
...
Caused by: com.foo.FooException: Foo Message
at com.baz.BazCode(BazCode.java:321)
....
Caused by: ...
Ancak varsayılan olarak, FooException
tüm kayıt stacktrace silinecek. Örneğin:
try {
foo.doSomething();
} catch (FooException foo) {
try {
bar.doSomethingElse();
} catch (BarException bar) {
BarException bar2 = new BarException(bar.getMessage(), foo);
bar2.setStackTrace(bar.getStackTrace());
throw bar2;
}
}
Ancak BarException
eğer böyle yok: BarException
bir (message, cause)
yapıcı varsa
// In a class written by me
/**
* ...
* @throws FooException if foo happens
* @throws BarException if bar happens
*/
public void upperFrame() {
try {
foo.doSomething();
} catch (FooException foo) {
bar.doSomethingElse();
}
}
// In class Bar (not written by me)
public void doSomethingElse() {
if (someConditionWhichHappensToBeTrueInThisScenario()) {
throw new BarException("Hello Bar World"); // At this point, FooException gets erased from the stack trace
}
}
sonra ben hedefe ulaşmak için "manuel klonlama" işleminin oldukça ham türlü takip edebilir bir kurucu (ClassCastException
örneğin) o zaman böyle yapıyor şeyler indirgendiğim:
try {
foo.doSomething();
} catch (FooException foo) {
try {
bar.doSomethingElse();
} catch (BarException bar) {
RuntimeException e = new RuntimeException("com.bar.BarException: " + bar.getMessage(), foo);
e.setStackTrace(bar.getStackTrace());
throw e;
}
}
Bu tehlikeli olduğunu Neden e
yanlış tipte ve bu nedenle daha yüksek çerçeveler tarafından doğru şekilde işlenemeyebilir.
Bu durumun üstesinden gelmek için "en iyi uygulama" yolu var mı?
bar.initCause(foo);
Sürece bağımsız değişken olarak yeni bir özgün durum geçerken
FooException'ın stacktrace bir Foo nedeniyle bir 'BarException 'oluştururken kayboldu mu? Ya da bar.getCause(). GetStackTrace() 'gibi bir şey yapabilir miydiniz? –
@KaspervandenBerg “FooException” un nasıl kaybolduğunu göstermek için sorumu düzenledim. Nedeni olan bir istisnanın yaratılmasıyla ilgili değildir, 'doSomethingElse' yöntemi tarafından atılan bir istisnadır. – Kidburla