1
resposta

try-with-resources ou try-finally?

Boa noite, pessoal, tudo bem?

Não sei se minha dúvida é muito leiga, mas vamos lá.. No exemplo da aula, o instrutor optou por usar o try-with-resources, para assim, garantir que os objetos que implementam "Autoclosable" sejam fechamos automaticamente sempre, não deixando conexões abertas com o banco de dados.

try(ResultSet rs = stm.getGeneratedKeys();) {        
            while(rs.next()) {
                Integer id = rs.getInt(1);
                System.out.println("Produto ID " + id + " criado com sucesso.");
            }
        }

Mas não seria mais legível utilizar o try-catch-finally pra isso? Quais os usos de cada um dos recursos? Qual tá mais próximo do uso no mercado? Penso que declaração explícita é sempre melhor que implícita (falando sobre o Autoclosable)...

Obrigado pela ajuda! :D

1 resposta

Oi Gabriel, ótima pergunta

O try with resources é mais poderoso que o try catch finally e sempre deve ser usado quando aplicável. Suponha que no seu try catch finally dê um erro dentro do catch ou do finally, você teria que colocar outro try catch dentro do catch. Quando você não usa try-with-resources, existe uma armadilha potencial chamada máscara de exceção. Quando o código em um bloco try lança uma exceção e o método close no finally também lança uma exceção, a exceção lançada pelo bloco try se perde e a exceção lançada no finally é propagada. Isso geralmente é problematico, uma vez que a exceção lançada no fechamento é algo inútil, enquanto a exceção útil é a inicial. (Portanto, em vez de ver o SQLException que informa qual restrição de integridade foi violada, você verá algo como BrokenPipeException, onde o fechamento do recurso falhou.). Com try-with-resources, se o bloco try lançar uma exceção e o método close também lançar uma exceção, então a exceção do bloco close é anexada à exceção original.