Восстановление исключений в 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());
}

У меня сработало....:)

Другие вопросы по тегам