Finally
Em sistemas reais, toda vez que você abre um recurso – como uma conexão com banco, um arquivo ou um socket – você precisa garantir que ele seja fechado, mesmo que ocorra um erro. Sem o finally, seu código pode vazar recursos, travando o sistema. Por isso, finally é essencial para executar limpeza obrigatória independentemente do que acontecer no try ou catch.
O PROBLEMA
Simule abertura de conexão com banco. Use try/catch/finally onde finally sempre fecha a conexão.
SOBRE O CONCEITO
O bloco finally é executado sempre, após o catch (se houver) e após o try, independentemente de uma exceção ter sido lançada ou não. Um erro comum é colocar a lógica de fechamento dentro do catch, mas se nenhum erro ocorrer, ela não será executada – ou seja, o recurso nunca será fechado. Outro erro comum é o finally executar antes do catch, o que é falso: a ordem é try -> catch (se exceção) -> finally. No exemplo, usamos if (conexao) no finally para verificar se a conexão foi realmente aberta antes de fechá-la, garantindo que a limpeza aconteça sem causar novos erros.
RESOLUÇÃO