Isso pode parecer uma questão de programação e eu pensei que sabia a resposta, mas agora me vejo precisando checar novamente. Neste trecho de código abaixo, a exceção lançada no primeiro bloco de captura será capturada pelo bloco de exceção geral abaixo?
try {
// Do something
} catch(IOException e) {
throw new ApplicationException("Problem connecting to server");
} catch(Exception e) {
// Will the ApplicationException be caught here?
}
Eu sempre pensei que a resposta seria não, mas agora tenho um comportamento estranho que pode ser causado por isso. A resposta é provavelmente a mesma para a maioria das linguagens, mas estou trabalhando em Java.
Respostas:
Não, pois o novo
throw
não está notry
bloco diretamente.fonte
RuntimeException
for lançado docatch
bloco, não haverá erro de compilação.catch
cláusula de exceção pai for listada antes de umacatch
cláusula de exceção filho . Meu entendimento é que o Java não permite isso e é capturado em tempo de compilação.Não. É muito fácil verificar.
Deve imprimir:
Tecnicamente, isso poderia ter sido um bug do compilador, dependente da implementação, comportamento não especificado ou algo assim. No entanto, o JLS é muito bem definido e os compiladores são bons o suficiente para esse tipo de coisa simples (a caixa de canto genérica pode ser uma questão diferente).
Observe também que, se você trocar os dois blocos catch, ele não será compilado. A segunda captura seria completamente inacessível.
Observe que o bloco final sempre é executado mesmo que um bloco coletor seja executado (exceto casos estúpidos, como loops infinitos, anexando-se à interface das ferramentas e eliminando o encadeamento, reescrevendo o código de código, etc.).
fonte
finally
é, é claro, ligarSystem.exit
. :-Pfor(;;);
é mais curto, contido na linguagem, não apresenta muitos efeitos colaterais e, para mim, mais óbvio.System.exit
é mais amigável para a CPU! : -O Mas sim, tudo bem, claramente esse é um critério subjetivo. Além disso, eu não sabia que você era um jogador de código. ;-)A especificação da linguagem Java diz na seção 14.19.1:
Referência: http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#24134
Em outras palavras, a primeira captura anexa que pode lidar com a exceção, e se uma exceção é lançada fora dessa captura, isso não está no escopo de nenhuma outra captura para a tentativa original, portanto, eles não tentarão lidar com isso.
Uma coisa relacionada e confusa a saber é que em uma estrutura try- [catch] -finally, um bloco finalmente pode lançar uma exceção e, nesse caso, qualquer exceção lançada pelo bloco try ou catch é perdida. Isso pode ser confuso na primeira vez que você o vê.
fonte
try
-with-resources. Então, setry
ANDfinally
lança ambos,finally
é suprimido, mas também é ADICIONADO à exceção detry
. Secatch
jogar também, você não terá sorte, a menos que você lide com isso por meio de 'addSuppressed' e adicionando atry
exceção - então você tem os três.Se você deseja lançar uma exceção do bloco catch, deve informar seu método / classe / etc. que ele precisa lançar a exceção. Igual a:
E agora seu compilador não gritará com você :)
fonte
Não - como Chris Jester-Young disse, ele será lançado para a próxima tentativa na hierarquia.
fonte
Como dito acima ...
Eu acrescentaria que, se você tiver problemas para ver o que está acontecendo, se não conseguir reproduzir o problema no depurador, poderá adicionar um rastreio antes de lançar novamente a nova exceção (com o bom e antigo System .out.println, na pior das hipóteses, com um bom sistema de log como o log4j).
fonte
Não será capturado pelo segundo bloco de captura. Cada exceção é capturada apenas quando dentro de um bloco try. Você pode aninhar tentativas (não que seja uma boa ideia em geral):
fonte
Não, uma vez que todas as capturas se referem ao mesmo bloco de tentativa, portanto, jogar de dentro de um bloco de captura seria capturado por um bloco de tentativa anexo (provavelmente no método que chamou esse)
fonte
Postagem antiga, mas a variável "e" deve ser única:
fonte