Перестроение исключений в 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); }
в Java почти то же самое:
try { ... } catch (Exception e) { if (e instanceof FooException) throw e; }
в Java вы просто бросаете исключение, которое вы поймали, так что
throw eа не простоthrow. Java поддерживает трассировку стека.
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. Дополнительные материалы для чтения можно найти здесь и здесь.
трассировка стека prserved, если вы обернете пойманный excetion в другое исключение (чтобы предоставить дополнительную информацию) или если вы просто перестроите пойманный excetion.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
Comments