Explorando a Importância do Try-Catch-Finally no Desenvolvimento Java: Garantindo Robustez e Confiabilidade

 

Quando iniciei meus estudos com Java, e o try-catch-finally apareceu, eu achei seu uso complexo e desnecessário, ingenuamente eu achava que o if-else era a solução ideal para tratar erros: “-Pra quê colocar essas palavras complicadas? Um System.out.print(”Erro x”); resolve”. Junto com ele, veio as Exceptions, tai outra palavra estrangeira que não fazia muito sentido, num ambiente propenso a erros, pode parecer estranho chamar algo de 'exceção' quando, na verdade, erros são esperados.

Bom, depois da minha má vontade inicial, entendi a força desse recurso, um simples if-else nunca conseguiria me ajudar a entender de onde erros que eu nunca pensaria que poderiam acontecer, acontecessem, isso só a stack trace de uma exception poderia fazer. E o try-cacth-finally, juntos, formam o recurso que o Java nos dá para antever o que com certeza vai acontecer com nossas aplicações: ERROS.

O que é o try-catch-finally?

O bloco try-catch-finally é uma estrutura que o Java possui para o controle de erros, separando tarefas de rotinas, de possíveis tratamentos de erros, e retirando a necessidade de testes antes da realização de operações. A JVM monitora o trecho de código delimitado pelo try, e quando algum erro ocorre, o fluxo é transferido para o cacth, que trata uma ou mais exceptions já pré-definidas.

Cada statement try necessita de pelo menos um catch ou finally.

Estrutura comum try-catch

 

O uso de NumberFormatException, indica que um erro de conversão de inteiro será tratado no catch específico. Isso isola o código de seus tratamentos de erros. É possível utilizar varias cláusulas de catch , cada uma tratando um erro específico, inclusive utilizando uma Exception personalizada.

Try-catch com tratamento de exceção personalizada

 

A ExceptionValue foi criada para o caso de o input ser um valor negativo. Porém, é possível notar, que no decorrer de novas regras, o número de catchs podem crescer demais. Pensando nisso, o multi-catch foi criado, esse recurso foi inserido no Java 7, onde o caractere “|” separa as exceções que podem ter o mesmo tipo de tratamento e assim, evitando mais verbosidade.

Multi-catch

 

O resultado é o mesmo, mas reduz consideravelmente o número de linhas!

E o finally?

Quando o finally é embutido no código, ele se torna inevitável! O que quer dizer, que não importa se o fluxo sofre alguma mudança, o que está dentro do seu code block será executado, seu uso parte da necessidade que certos processos precisarem ser encerrados ou liberados.

Se notar, o sc.close() está fora do bloco de try-catch, isso significa que em caso de desvio de fluxo, o Scanner manterá uma conexão aberta, ou seja, recursos estão sendo desperdiçados, causando problemas de desempenho, e em casos de alto volume de entrada de dados, isso se torna ainda mais oneroso. Com a crescente migração para aplicações em nuvem onde os recursos são cobrados com base no uso, desperdício não é uma opção! 

Uso de finally

 

Pronto, o finally garante o fechamento do recurso!

Try-with-resources

Mas claro que a responsabilidade de fechar cada recurso aberto, tende a causar alguns empecilhos, como verbosidade, repetição de código e esquecimento por parte dos desenvolvedores. Foi por isso, que também no Java 7, surgiu o try-with-resources ou ARM (Automatic Resource Management) que inclui quase todas objetos que implementem Closeable e AutoCloseable, e que possuam um método close().

A classe Scanner implementa as interfaces Closeable e AutoCloseable, e assim pode ser inserida na abertura do try, garantindo o fechamento automático de seus recursos, como mostra o exemplo. 

Exemplo de ARM

 

Cenários de Uso do try-catch-finally/resources

  1. Operações de E/S (Entrada/Saída): Ao lidar com operações de leitura ou gravação de arquivos, interações com bancos de dados ou conexões de rede, o try-catch-finally se torna essencial. Ele nos permite capturar e tratar exceções que podem ocorrer durante essas operações, garantindo que nosso código seja robusto e capaz de lidar com falhas imprevistas.
  2. Conexões de Banco de Dados: Em aplicações que interagem com bancos de dados, é crucial garantir que as conexões sejam adequadamente abertas e fechadas. O bloco try-with-resources, simplifica essa tarefa, garantindo que recursos como conexões de banco de dados sejam fechados corretamente, mesmo em caso de exceção.

Conclusão

Embora possa parecer complexo no início, o try-catch-finally é uma parte fundamental do desenvolvimento de software em Java. Ao compreender sua importância e aprender a usá-lo de maneira eficaz, os desenvolvedores podem escrever código mais robusto e confiável, capaz de lidar com os desafios do mundo real. Então, da próxima vez que você se deparar com um bloco try-catch-finally, lembre-se de sua importância e aproveite seu poder para escrever software resiliente e seguro.

Referências:

  • Java: Guia do Programador Java 16
  • Documentação do Java - Classe Scanner
  • Documentação do Java - Interface Closeable
  • Documentação do Java - Interface AutoCloseable

Repositório GitHub com exemplos: inputreader

 

 

 

 

Comentários

Postagens mais visitadas deste blog

Código Limpo - Capitulo 1

Cloud Finops - Capítulo 1 - O que é FinOps?

O que é CDD?