em Java O tratamento de excees indispensvel para tornar uma aplicao robusta, isso porque o usurio no quer ver um StackTrace na sua tela, mas sim uma mensagem bem escrita apontando que apenas ocorreu um erro. Para nos situarmos um pouco mais na importncia desse tipo de tratamento podemos citar o prprio Sistema Operacional Windows. Voc sabe porque a famosa tela azul da morte azul ? Porque foi comprovado cientificamente, que o azul transparece calma ao usurio, deixando o mesmo mais tranquilo. Imagine se a tela azul da morte fosse vermelha ? Tente pensar no pnico que causaria a apresentao desta tela. Enfim, toda e qualquer aplicao est sujeita a falhas, e por conta disso, toda e qualquer aplicao tambm precisa de tratamento dessas falhas. O objetivo deste artigo mostrar um pouco mais sobre o tratamento de excees em Java, mais especificamente para exemplificar a diferena entre excees Checked e Unchecked. Checked e Unchecked Exceptions A principal pergunta do desenvolvedor neste ponto : Essa exceo checked ou unchecked ? A minha exceo checked ou unchecked ? Como tornar uma exceo checked ou unchecked ? Enfim, todas essas perguntas sero respondidas ao longo deste artigo. Resumidamente as excees Checked so aquelas no qual voc obrigado a trat-la, seja com um bloco try- catch ou mesmo com um throws (relanando a mesma para outro local). Por outro lado, quando voc tem excees do tipo Unchecked no obrigatrio o tratamento da mesma, voc pode tratar apenas se quiser, se sentir que necessrio para o bom funcionamento da sua aplicao. Checked exceptions so utilizadas para erros recuperveis enquanto que Unchecked exceptions so utilizadas para erros irrecuperveis. Significa dizer que quando voc sabe que seu erro pode ser tratado, voc utiliza Checked Exceptions, caso contrrio utilize Unchecked Exceptions. Para ilustrar isso, imagine que voc criou uma Exception chamada ValorPagamentoMenorTaxaEmbarqueException, isso significa que quando o valor do pagamento for menor que a taxa de embarque voc lanar uma Exception e tratar da forma que achar melhor, por exemplo: Pedindo para o usurio aumentar o valor do pagamento. Essas so as Checked Exceptions, voc sabe que o erro poder ocorrer e j sabe como corrigi-lo caso ocorra. Por outro lado, imagine um NullPointerException inesperado na sua aplicao. Esse erro no pode ser tratado, o erro ocorreu e pronto, voc deve apenas mostrar uma mensagem ao usurio dizendo que o erro ocorreu, mas nada poder ser feito para corrigi-lo, se no reiniciar todo o processamento. Essas so as Unchecked Exceptions, que geralmente so filhas de RuntimeException, isso porque estas so excees que ocorrem em tempo de execuo (runtime) e no em tempo de design. Quando voc cria um bloco de cdigo que exige que voc use try-catch ou throws, estar em frente a uma tpica Checked Exception, diferente das RuntimeExceptions que s ocorrem em tempo de execuo e so inesperadas. As Unchecked Exceptions pelo fato de no serem obrigatoriamente tratadas, automaticamente relanam suas excees, ou seja, possuem throws implcito no mtodo que as criou. 2
Problemas Ocorre em alguns casos, que este padro no bem aplicado, como o caso da API JDBC. Veja na listagem 1 o uso errado deste padro: Listagem 1: JDBC utilizando excees de forma errnia try { PreparedStatement stmt = con.prepareStatement(query); // ... } catch (SQLException e) {
throw new AcessoADadosException("Problema na criao do Statement", e);
} Voc deve estar familiarizado em sempre ter que fazer o try-catch ou throws ao usar a API JDBC, tratando uma SQLException. Mas se voc parar para pensar, a SQLException uma exceo muito genrica e que na maioria das vezes irrecupervel. Imagine por exemplo se o seu banco de dados queimou, como voc ir recuperar isso ? No h como, apenas poder mostrar uma mensagem ao usurio. Na listagem 1, transformamos a suposta Checked SQLException em uma Unchecked Exception atravs do AcessoADadosException que apenas retornar uma mensagem com o erro e nada mais poder ser feito. Acostume-se com essa falta de padronizao, pois poder encontrar muitos cdigos aplicados Checked no lugar de Unchecked e vice-versa, mas conhecendo o conceito de ambos, voc poder facilmente realizar as transformaes necessrias. Exemplo Prtico Para finalizarmos esse assunto, vamos aplicar os conceitos do artigo a um exemplo prtico, onde teremos a seguinte situao: Nosso mtodo tentar escrever um arquivo em uma pasta A, porm caso ocorre algum erro de IOException ( um Checked Exception) ns tentaremos gravar na Pasta Alternativa. Porque isso ? Imagine que a pasta A no computador do usurio pode estar sem permisso de escrita, e para no perdemos o arquivo vamos gravar na pasta Alternativa que sabemos que sempre ter permisso de escrita em qualquer dos casos. Depois podemos pegar todos os arquivos que ficaram na pasta alternativa e coloc-los na pasta B manualmente, porm no perderemos o processamento. Na listagem 2 voc ver o cdigo do caso descrito acima. Listagem 2: Exemplo real de um Checked Exception private void criaArquivo(String pathAlternativo) { File arquivo = null; try {
SimpleDateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
if (pathAlternativo.equals("")) arquivo = new File("/home/admin/Documentos/arquivo_" + fmt.format(new Date()) ); else arquivo = new File(pathAlternativo+"arquivo_" + fmt.format(new Date()) );
BufferedWriter writer = new BufferedWriter(new FileWriter(arquivo)); writer.write("Linha 001"); writer.close(); 3
} catch (IOException e ) { if (arquivo != null){ if (arquivo.exists()){ arquivo.delete(); criaArquivo("/home/admin/PathAlternativo/"); } } } } Poderiamos at melhorar um pouco o cdigo acima colocando 1 Exception genrico, assim qualquer coisa que no fosse um IOException poderiamos tratar como um Unchecked Exception, pois seria um erro irrecupervel e nada poderamos fazer. CONCLUSO muito provvel que a maioria dos profissionais no conheam a real utilizao do conceito descrito neste artigo, isso porque por muita das vezes este passa despercebido e sem uma utilidade visvel. Porm com o aprendizado deste, fica muito mais fcil entender a real aplicao (baseada nas boas prticas de programao) das exceptions.
Protocolo JC3IEDM para Integração de Sistemas C2 resume de forma concisa e relevante para o o tema central do documento, que é a proposta de um protocolo baseado no modelo JC3IEDM