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



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



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


есть ли что-то подобное в Java (это не потеряет исходную трассировку стека)?

527   8  

8 ответов:

catch (WhateverException e) {
    throw e;
}

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

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

try
{
   ...
}
catch (FooException fe){
   throw fe;
}
catch (Exception 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 поддерживает трассировку стека.

как то так

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. Дополнительные материалы для чтения можно найти здесь и здесь.

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

try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }

Comments

    Ничего не найдено.