Восстановление исключений в Java без потери трассировки стека
В C# я могу использовать throw;
Инструкция для переброса исключения при сохранении трассировки стека:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Есть ли что-то подобное в Java (что не теряет оригинальную трассировку стека)?
8 ответов
catch (WhateverException e) {
throw e;
}
просто отбросит исключение, которое вы поймали (очевидно, окружающий метод должен разрешить это через свою подпись и т. д.). Исключение сохранит исходную трассировку стека.
Вы также можете заключить исключение в другое И сохранить исходную трассировку стека, передав исключение как Throwable в качестве параметра причины:
try
{
...
}
catch (Exception e)
{
throw new YourOwnException(e);
}
Я бы предпочел:
try
{
...
}
catch (FooException fe){
throw fe;
}
catch (Exception e)
{
...
}
В Java это почти то же самое:
try
{
...
}
catch (Exception e)
{
if (e instanceof FooException)
throw e;
}
В Java вы просто бросаете исключение, которое вы поймали, поэтому throw e
а не просто throw
, Java поддерживает трассировку стека.
Трассировка стека сохраняется, если вы переворачиваете пойманное исключение в другое исключение (для получения дополнительной информации) или просто перебрасываете пойманное исключение.
try{
...
}catch (FooException e){
throw new BarException("Some usefull info", e);
}
Что -то вроде этого
try
{
...
}
catch (FooException e)
{
throw e;
}
catch (Exception e)
{
...
}
public int read(byte[] a) throws IOException {
try {
return in.read(a);
} catch (final Throwable t) {
/* can do something here, like in=null; */
throw t;
}
}
Это конкретный пример, где метод бросает IOException
, final
средства t
может содержать только исключение, выброшенное из блока try. Дополнительный материал для чтения можно найти здесь и здесь.
У меня была аналогичная ситуация, когда мой код потенциально генерирует ряд различных исключений, которые я просто хотел повторно выбросить. Описанное выше решение не сработало для меня, потому что Eclipse сказал мне, чтоthrow e;
приводит к необработанному исключению, поэтому я сделал следующее:
try
{
...
} catch (NoSuchMethodException | SecurityException | IllegalAccessException e) {
throw new RuntimeException(e.getClass().getName() + ": " + e.getMessage() + "\n" + e.getStackTrace().toString());
}
У меня сработало....:)