W języku C # mogę użyć throw;
instrukcji, aby ponownie wygenerować wyjątek, zachowując ślad stosu:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Czy jest coś takiego w Javie ( która nie traci pierwotnego śladu stosu )?
Throwable
nie są modyfikowane przez ich rzucanie. Aby zaktualizować ślad stosu, musisz wywołaćfillInStackTrace()
. Dogodnie ta metoda jest wywoływana w konstruktorzeThrowable
.throw e;
utraci ślad stosu. Ale nie w Javie.Odpowiedzi:
po prostu zwróci wyjątek, który złapałeś (oczywiście otaczająca metoda musi na to pozwolić poprzez swój podpis itp.). Wyjątek zachowa oryginalny ślad stosu.
źródło
catch(Exception e) { throw e; }
będzie możliwe. Jeślicatch(InterruptedException ie) { throw ie; }
to zostanie załatwione. Zasadniczo, nie róbcatch(Exception e)
- to nie jest pokemon i nie chcemy ich wszystkich złapać!Wolałbym:
źródło
Exception
zwykle nie jest właściwym rozwiązaniem w większości (ale nie wszystkich) przypadkach.Możesz także owinąć wyjątek w inny ORAZ zachować ślad oryginalnego stosu, przekazując wyjątek jako Throwable jako parametr przyczyny:
źródło
throw new YourOwnException("Error while trying to ....", e);
W Javie jest prawie tak samo:
źródło
W Javie po prostu rzucasz wyjątek, który złapałeś,
throw e
a nie tylkothrow
. Java utrzymuje śledzenie stosu.źródło
coś takiego
źródło
Jest to konkretny przykład, w którym metoda rzuca an
IOException
. Tefinal
środkit
mogą posiadać tylko wyjątek wyrzucony z bloku try. Dodatkowe materiały do czytania można znaleźć tutaj i tutaj .źródło
Śledzenie stosu jest zachowywane, jeśli złapiesz wychwycony ekscytację w inny wyjątek (aby uzyskać więcej informacji) lub jeśli po prostu ponownie rzucisz złapany wykop.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
źródło
Właśnie miałem podobną sytuację, w której mój kod potencjalnie generuje wiele różnych wyjątków, które chciałem po prostu ponownie wprowadzić. Rozwiązanie opisane powyżej nie działało dla mnie, ponieważ Eclipse powiedział mi, że
throw e;
prowadzi to do niewymienionego wyjątku, więc właśnie to zrobiłem:Pracował dla mnie .... :)
źródło