В C # я могу использовать throw;
инструкцию, чтобы перебросить исключение при сохранении трассировки стека:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Есть ли что-то подобное в Java ( что не теряет оригинальную трассировку стека )?
Throwable
s не изменяются, бросая их. Чтобы обновить трассировку стека, вам нужно позвонитьfillInStackTrace()
. Удобно, чтобы этот метод вызывался в конструкторе aThrowable
.throw e;
потеряет трассировку стека. Но не на Яве.Ответы:
просто отбросит исключение, которое вы поймали (очевидно, окружающий метод должен разрешить это через свою подпись и т. д.). Исключение сохранит исходную трассировку стека.
источник
catch(Exception e) { throw e; }
этим не справитесь. Если вамcatch(InterruptedException ie) { throw ie; }
это будет обработано. Как правило, не надоcatch(Exception e)
- это не покемон, и мы не хотим их всех ловить!Я бы предпочел:
источник
Exception
в большинстве (но не во всех) случаях отлов обычно не является правильным решением .Вы также можете заключить исключение в другое И сохранить исходную трассировку стека, передав исключение как Throwable в качестве параметра причины:
источник
throw new YourOwnException("Error while trying to ....", e);
В Java это почти то же самое:
источник
В Java вы просто генерируете исключение, которое вы поймали,
throw e
а не простоthrow
. Java поддерживает трассировку стека.источник
что-то вроде этого
источник
Это конкретный пример, где метод выдает
IOException
. Вfinal
средствеt
может содержать только исключение брошенного из блока Try. Дополнительные материалы для чтения можно найти здесь и здесь .источник
Трассировка стека сохраняется, если вы переворачиваете пойманное исключение в другое исключение (для получения дополнительной информации) или просто перебрасываете пойманное исключение.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
источник
У меня просто была похожая ситуация, в которой мой код потенциально генерировал множество различных исключений, которые я просто хотел перебросить. Решение, описанное выше, не работает для меня, потому что Eclipse сказал мне, что
throw e;
приводит к необработанному исключению, поэтому я просто сделал это:Работал на меня .... :)
источник