Escola Superior de Gestão e Tecnologia Tratamento de Exceções
Objetivos Compreender como o tratamento de exceção e de erro funciona. Como u4lizar try, throw e catch para detectar, indicar e tratar exceções, respec4vamente. Como u4lizar o bloco finally para liberar recursos. Como os rastreamentos de pilha ajudam na depuração. Como criar exceções encadeadas que mantêm informações do rastreamento de pilha completo. Como as exceções são organizadas em uma hierarquia de classes de exceção. Como declarar novas classes de exceção.
Motivação Detecção e tratamento de ERROS que podem ocorrer durante a execução do programa. Exemplo: Ø Programa que captura um número inteiro do teclado para dividir por 1.000.
O que é uma exceção? Exceção Ø uma indicação de um problema que ocorre durante a execução de um programa. Tratamento de exceções Ø resolver exceções que poderiam ocorrer para que o programa con4nue ou termine elegantemente. O tratamento de exceções permite que os programadores criem programas mais robustos e tolerantes a falhas.
Exemplo import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; public class Exceção { public static void main(string[] arg) throws IOException { InputStreamReader leitor = new InputStreamReader(System.in); BufferedReader teclado = new BufferedReader(leitor); System.out.print("Digite um numero: "); int num = Integer.parseInt(teclado.readLine()); int quoc = 1000 / num; } } System.out.println("1000/" + num + " = " + quoc); System.out.println("fim de programa");
O que acontece quando digitamos 0?
Por que tratar exceções? É possível evitar o erro anterior com if (num == 0){ } MAS: Ø Misturar a lógica do programa com a lógica do tratamento de erros pode tornar os programas dijceis de ler, modificar, manter e depurar. O tratamento de exceções permite aos programadores remover código de tratamento de erro da linha principal de execução do programa. Ø Aprimora a clareza. Ø Aprimora a modificabilidade.
Se os problemas potenciais ocorrem raramente, mesclar o programa e a lógica do tratamento de erro pode degradar o desempenho de um programa, porque o programa deve realizar testes frequentes para determinar se a tarefa foi executada corretamente e se a próxima tarefa pode ser realizada.
Exemplo: Divisão por zero sem tratamento de exceções Exceção lançada uma exceção que ocorreu. Rastreamento de pilha: Ø Nome da exceção em uma mensagem descri4va que indica o problema. Ø Pilha de chamadas de método. ArithmeticException pode surgir a pargr de diferentes problemas na aritmégca. Ponto de lançamento Ø Ponto inicial em que a exceção ocorre, linha superior da cadeia de chamadas. Uma InputMismatchException ocorre quando o método Scanner nextint recebe uma string que não representa um inteiro válido.
Como é feito o tratamento de erros? Através do comando try e suas cláusulas catch e finally. Combinações válidas: try{} catch{} try{} finally{} try{} catch{} finally{}
Combinações Inválidas (não compila) try{} catch{} finally{} try{} finally{} catch{}
Incluindo código em um bloco try Bloco try contém o código que pode lançar (throw) uma exceção. Ø Consiste na palavra- chave try seguida por um bloco de código entre chaves. Ø Se ocorrer uma exceção em algum ponto, o restante do código congdo no bloco try não será executado.
Capturando exceções Um bloco catch: Ø Captura, isto é, recebe e trata uma exceção. Ø Começa com a palavra- chave catch. Ø Parâmetro de exceção entre parênteses ü iden4fica o 4po de exceção e ü permite que o bloco catch interaja com o objeto da exceção capturada. Ø Bloco do código entre chaves que executa quando uma exceção do 4po adequado ocorre. Bloco catch correspondente Ø o 4po do parâmetro de exceção corresponde exatamente ao 4po de exceção lançado ou é uma superclasse dele. Exceção não- capturada Ø uma exceção que ocorre para a qual não há nenhum bloco catch correspondente. ü Faz com que o programa termine se o programa 4ver somente um thread; ü do contrário apenas o thread atual é terminado e pode haver efeitos adversos no restante do programa.
Tratamento de Exceções Devemos inserir dentro do bloco do TRY as instruções que queremos monitorar para evitar as execeções. Ø TRY - CATCH Exemplo: Ø Programa que captura um número inteiro do teclado para dividir por 1.000.
Tratamento de Exceções import java.io.*; public class Exemplo6 { public static void main(string[] arg) throws IOException { InputStreamReader leitor = new InputStreamReader(System.in); BufferedReader teclado = new BufferedReader(leitor); System.out.print("Digite um numero: "); try { int num = Integer.parseInt(teclado.readLine()); int quoc = 1000 / num; System.out.println("1000/" + num + " = " + quoc); } catch (ArithmeticException e) { System.out.println("nada a calcular"); } catch (NumberFormatException e) { System.out.println("foi digitado um valor não inteiro"); } } } System.out.println("fim de programa");
try finally O comando try pode ter apenas uma cláusula- finally, e se houver deve ser a sua úlgma cláusula. Ela só faz diferença nas situações em que o processamento é interrompido pela ocorrência de erros não- tratados por nenhuma cláusula- catch. Exemplo: Programa que divide dois números digitados pelo usuário
Bloco finally Programas que obtêm certos recursos devem retorna - los ao sistema explicitamente para evitar vazamentos de recursos. Bloco finally: Ø Consiste na palavra- chave finally seguida por um bloco do código entre chaves. Ø Opcional em uma instrução try. Ø Se presente, é colocado depois do úl4mo bloco catch. Ø Executa se uma exceção for lançada no bloco try correspondente ou qualquer um dos seus blocos catch correspondentes. Ø Não executara se a aplicação encerrar prematuramente em um bloco try via o método System.exit. Ø Em geral, contém código de liberação de recursos.
Bloco finally (Continuação) Se nenhuma exceção ocorrer, os blocos catch são pulados e o controle prossegue para o bloco finally. Depois de o bloco finally executar, o controle prossegue para a primeira instrução depois do bloco finally. Se ocorrer uma exceção no bloco try, o programa pula o restante do bloco try. A primeira correspondência no bloco catch é executada e o controle prossegue para o bloco finally. Ø Se ocorrer uma exceção e não houver nenhum bloco catch correspondente, o controle prossegue para o bloco finally. Ø Depois de o bloco finally executar, o programa passa a exceção para o próximo bloco try externo. Se um bloco catch lançar uma exceção, o bloco finally ainda executara.
import java.io.*; public class Exemplo { public static void main(string[] args) { int num = 0, den = 0; InputStreamReader leitor = new InputStreamReader(System.in); BufferedReader teclado = new BufferedReader(leitor); System.out.println("Digite dois números seguidos da tecla ENTER:"); } } try { num = Integer.parseInt (teclado.readline()); den = Integer.parseInt(teclado.readLine()); System.out.println (num + / + den + " = + (num/den)); } catch (NumberFormatException e){ System.out.println ("Erro de formato."); } catch (IOException e) { System.out.println ("Erro de E/S."); } finally { System.out.println("Saindo do Bloco \"Try\".");} System.out.println("Fim do programa"); }
Modelo de terminação de tratamento de exceções Quando uma exceção ocorre: Ø O bloco try termina imediatamente. Ø O programa transfere o controle para o primeiro bloco catch correspondente. Depois de a exceção ser tratada: Ø O controle do programa não retorna ao ponto de lançamento porque o bloco catch terminou; o fluxo de controle prossegue para a primeira instrução depois do úl4mo bloco catch. Ø Outras linguagens tratam da seguinte forma: ü O controle do programa é retomado logo depois do ponto de lançamento.
Utilizando a cláusula throws Cláusula throws especifica as exceções que um método pode lançar. Ø Aparece depois da lista de parâmetros do método e antes do corpo do método. Ø Contém uma lista separada por vírgulas das exceções. Ø As exceções podem ser lançadas pelas instruções no corpo do método ou pelos métodos chamados no corpo do método. Ø As exceções podem ser dos 4pos listados na cláusula throws ou subclasses.
Lançando exceções com a instrução throw Instrução throw uglizada para lançar exceções. Os próprios programadores podem lançar exceções a pargr de um método se algo der errado. A instrução throw consiste na palavra- chave throw seguida pelo objeto de exceção.
printstacktrace, getstacktrace e getmessage Os métodos na classe Throwable recuperam informações adicionais sobre uma exceção. Ø printstacktrace ü envia a saída do rastreamento de pilha para o fluxo de erros padrão. Ø getstacktrace ü Recupera informações do rastreamento de pilha como um array de objetos. ü StackTraceElement; permite processamento personalizado das informações sobre a exceção. Ø getmessage ü retorna a string descri4va armazenada em uma exceção.
printstacktrace, getstacktrace e getmessage Métodos StackTraceElement: Ø getclassname Ø getfilename Ø getlinenumber Ø getmethodname As informações sobre o rastreamento de pilha seguem o padrão nomedaclasse.nomedométodo(nomedoarquivo: númerodalinha)
Quando utilizar o tratamento de exceções O tratamento de exceções foi concebido para processar erros síncronos. Ø Erros síncronos ü ocorrem quando uma instrução executa. Ø Erros assíncronos ü ocorrem em paralelo e independente do fluxo de controle do programa.
Exceções encadeadas Exceções encadeadas permitem a um objeto de exceção manter informações completas sobre o rastreamento de pilha quando uma exceção é lançada a pargr de um bloco catch. Os usuários podem recuperar as informações sobre uma exceção original. O rastreamento de pilha proveniente de uma exceção encadeada exibe quantas exceções encadeadas restam
Dicas de engenharia de software Incorpore sua estratégia de tratamento de exceções no sistema desde o princípio do processo de projeto. Pode ser di_cil incluir um tratamento de exceções eficiente depois que um sistema foi implementado.
Hierarquia de exceção em Java Todas as exceções são herdadas direta ou indiretamente da classe ExcepGon. Ø As classes Exception formam uma hierarquia de herança que pode ser estendida. Ø Classe Throwable, superclasse da Exception: ü Somente objetos Throwable podem ser u4lizados com o mecanismo de tratamento de exceções. ü Tem duas subclasses: Exception e Error. A classe ExcepGon e suas subclasses representam situações excepcionais que podem ocorrer em um programa Java e que podem ser capturadas pelo aplicagvo. A classe Error e suas subclasses representam situações anormais que poderiam acontecer na JVM normalmente não é possível que um programa se recupere de Errors.
Como os erros são caracterizados (indicados)? Os erros são idengficados por objeto de classes específicas durante a execução dos programas. Existem dois Gpos de classes: Ø Classe Error ü Erros Estruturais, como mau funcionamento da máquina virtual Ø Classe ExcepGon ü Erros que podem ser tratados dentro do projeto, que servem de superclasses para as demais. Ambas são subclasses da classe Throwable
Árvore de Exceções e Erros
Hierarquia de heranças de Throwable
Classes de Erro e Exceção
Tipos comuns de erros de execução? Problema Índice de uma lista (Array) fora do intervalo permi4do. Problemas em operações aritmé4cas, tais como: Divisões por zero. Uso de referência que são a ponta para nenhum objeto. Classe que iden4fica o 4po de erro IndexOutOeoundsExcep4on Arithme4cExcep4on IOExcep4on
Hierarquia de exceções do Java Duas categorias de exceções: verificadas e não- verificadas. Exceções verificadas: Ø As exceções que são herdadas da classe Exception, mas não de RuntimeException. Ø O compilador impõe um requisito do Gpo capturar ou declarar. Ø O compilador verifica cada chamada de método e declaração de método para determinar se o método lança (throws) exceções verificadas. ü Se lançar, o compilador assegura que a exceção verificada é capturada ou declarada em uma cláusula throws. ü Se não capturada nem declarada, ocorre um erro de compilador.
Hierarquia de exceções do Java Duas categorias de exceções: verificadas e não- verificadas. Exceções não- verificadas: Ø Herdam da classe RuntimeException ou da classe Error. Ø O compilador não verifica o código para ver se a exceção foi capturada ou declarada. Ø Se uma exceção não- verificada ocorrer e não 4ver sido capturada, o programa terminara ou executara com resultados inesperados. Ø Em geral, podem ser evitadas com uma codificação adequada.
Hierarquia de exceções do Java O bloco catch captura todas as exceções do seu 4po e das subclasses do seu Gpo. Se houver múl4plos blocos catch que correspondam a um 4po par4cular de exceção, somente a primeiro bloco catch correspondente executa. Faz sen4do u4lizar um bloco catch de uma superclasse quando todos os blocos catch para as subclasses dessa classe realizarem a mesma funcionalidade.
Declarando novos tipos de exceção Você pode declarar suas próprias classes de exceção específicas dos problemas que podem ocorrer quando um outro programa ugliza suas classes reuglizáveis. A nova classe de exceção deve estender uma classe de exceção existente. Em geral, ela contém somente dois construtores: Ø Um não recebe nenhum argumento, passa mensagens de exceção padrão para o construtor da superclasse. Ø O outro recebe uma mensagem personalizada de exceção como uma string e a passa para o construtor da superclasse.