Исключение исключений в Java без потери трассировки стека

В С# я могу использовать оператор throw; для восстановления исключения при сохранении трассировки стека:

try
{
   ...
}
catch (Exception e)
{
   if (e is FooException)
     throw;
}

Есть ли что-то подобное в Java (, которая не теряет исходную трассировку стека)?

Ответ 1

catch (WhateverException e) {
    throw e;
}

будет просто отменять исключение, которое вы поймали (очевидно, окружающий метод должен разрешить это через его подпись и т.д.). Исключение будет поддерживать исходную трассировку стека.

Ответ 2

Я бы предпочел:

try
{
    ...
}
catch (FooException fe){
   throw fe;
}
catch (Exception e)
{
    // Note: don't catch all exceptions like this unless you know what you
    // are doing.
    ...
}

Ответ 3

Вы также можете обернуть исключение в другое. Сохраните исходную трассировку стека, передав в качестве параметра причины исключение как Throwable:

try
{
   ...
}
catch (Exception e)
{
     throw new YourOwnException(e);
}

Ответ 4

В Java почти то же самое:

try
{
   ...
}
catch (Exception e)
{
   if (e instanceof FooException)
     throw e;
}

Ответ 5

В Java вы просто бросаете исключение, которое вы поймали, поэтому throw e, а не только throw. Java поддерживает трассировку стека.

Ответ 6

что-то вроде этого

try 
{
  ...
}
catch (FooException e) 
{
  throw e;
}
catch (Exception e)
{
  ...
}

Ответ 7

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. Дополнительный материал для чтения можно найти здесь и здесь.

Ответ 8

Трассировка стека сохраняется, если вы переворачиваете пойманное исключение в другое исключение (для получения дополнительной информации) или просто перебрасываете пойманное исключение.

try{... }catch (FooException e){ throw new BarException("Some usefull info", e); }