Supponiamo che io stia gestendo FooException
e BarException
. Supponiamo che siano entrambe eccezioni non controllate.Come ottenere una traccia di stack correttamente concatenata per le eccezioni generate durante la gestione di altre eccezioni?
Quello che voglio vedere nella stacktrace è:
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: ...
Tuttavia, per impostazione predefinita, tutti i record di FooException
sarà cancellato dal stacktrace. Per esempio:
// 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
}
}
Se BarException
ha un costruttore (message, cause)
poi mi può seguire una specie piuttosto grezzo di processo di "manuale di clonazione" per raggiungere il mio obiettivo:
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;
}
}
Tuttavia, se BarException
non ha tale un costruttore (ad esempio ClassCastException
) allora io sono ridotto a fare le cose in questo modo:
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;
}
}
questo è essere pericoloso causa e
ha il tipo sbagliato e quindi potrebbe non essere gestito correttamente da frame superiori.
Esiste un modo "best practice" per gestire questa situazione?
La stacktrace di 'FooException' è persa durante la creazione di una' BarException' con una causa Foo? Oppure potresti fare qualcosa come 'bar.getCause(). GetStackTrace()'? –
@KaspervandenBerg Ho modificato la mia domanda per mostrare come si perde 'FooException'. Non è correlato a nessuna creazione di un'eccezione con una causa, è un'eccezione generata dal metodo 'doSomethingElse'. – Kidburla