Em C #, posso usar a throw;
instrução para repetir uma exceção, preservando o rastreamento de pilha:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Existe algo parecido com isto em Java ( que não perde o rastreamento de pilha original )?
Throwable
s não são modificados jogando-os. Para atualizar o rastreamento de pilha, é necessário chamarfillInStackTrace()
. Convenientemente, esse método é chamado no construtor de aThrowable
.throw e;
perderá o rastreamento de pilha. Mas não em Java.Respostas:
simplesmente retrocederá a exceção que você capturou (obviamente, o método circundante deve permitir isso por meio de sua assinatura etc.). A exceção manterá o rastreamento de pilha original.
fonte
catch(Exception e) { throw e; }
. Se vocêcatch(InterruptedException ie) { throw ie; }
será tratado. Como regra geral, nãocatch(Exception e)
- isso não é pokemon, e não queremos pegá-los todos!Eu preferiria:
fonte
Exception
geralmente não é a coisa certa a ser feita, na maioria (mas não em todos) os casos.Você também pode agrupar a exceção em outra E manter o rastreamento da pilha original passando a exceção como Throwable como o parâmetro de causa:
fonte
throw new YourOwnException("Error while trying to ....", e);
Em Java é quase o mesmo:
fonte
Em Java, você apenas lança a exceção capturada,
throw e
e não apenasthrow
. Java mantém o rastreamento de pilha.fonte
algo assim
fonte
Este é um exemplo concreto em que o método lança um
IOException
. Osfinal
meiost
podem conter apenas uma exceção lançada do bloco try. Material de leitura adicional pode ser encontrado aqui e aqui .fonte
O rastreamento de pilha é preservado se você agrupar a exceção capturada em uma outra exceção (para fornecer mais informações) ou se você apenas reproduzir novamente a exceção capturada.
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
fonte
Eu estava apenas tendo uma situação semelhante na qual meu código potencialmente gera uma série de exceções diferentes que eu só queria relançar. A solução descrita acima não estava funcionando para mim, porque o Eclipse me disse que isso
throw e;
leva a uma exceção sem tratamento, então fiz isso:Trabalhou para mim .... :)
fonte