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

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

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

Есть ли что-то подобное в Java (that doesn't lose the original stack trace)?

Ответы на вопрос(8)

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

try{ ... }catch (FooException e){ throw new BarException("Some usefull info", 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. Дополнительный материал для чтения можно найтиВот а такжеВот.

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

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

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

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

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

try 
{
  ...
}
catch (FooException e) 
{
  throw e;
}
catch (Exception e)
{
  ...
}
Решение Вопроса
catch (WhateverException e) {
    throw e;
}

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

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

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

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

Ваш ответ на вопрос