Ответ 1
catch (WhateverException e) {
throw e;
}
будет просто отменять исключение, которое вы поймали (очевидно, окружающий метод должен разрешить это через его подпись и т.д.). Исключение будет поддерживать исходную трассировку стека.
В С# я могу использовать оператор throw;
для восстановления исключения при сохранении трассировки стека:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Есть ли что-то подобное в Java (, которая не теряет исходную трассировку стека)?
catch (WhateverException e) {
throw e;
}
будет просто отменять исключение, которое вы поймали (очевидно, окружающий метод должен разрешить это через его подпись и т.д.). Исключение будет поддерживать исходную трассировку стека.
Я бы предпочел:
try
{
...
}
catch (FooException fe){
throw fe;
}
catch (Exception e)
{
// Note: don't catch all exceptions like this unless you know what you
// are doing.
...
}
Вы также можете обернуть исключение в другое. Сохраните исходную трассировку стека, передав в качестве параметра причины исключение как Throwable:
try
{
...
}
catch (Exception e)
{
throw new YourOwnException(e);
}
В Java почти то же самое:
try
{
...
}
catch (Exception e)
{
if (e instanceof FooException)
throw e;
}
В Java вы просто бросаете исключение, которое вы поймали, поэтому throw e
, а не только throw
. Java поддерживает трассировку стека.
что-то вроде этого
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. Дополнительный материал для чтения можно найти здесь и здесь.
Трассировка стека сохраняется, если вы переворачиваете пойманное исключение в другое исключение (для получения дополнительной информации) или просто перебрасываете пойманное исключение.
try{... }catch (FooException e){ throw new BarException("Some usefull info", e); }