Capítulo 15 – Tratamento de Exceções Outline 15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 15.10 Introdução Uma visão geral do tratamento de Exceções Um exemplo do tratamento de exceções: divisão por zero A hierarquia das exceções em Java Disparando novamente uma exceção A cláusula finally Propagação de exceções printStackTrace, getStackTrace e getMessage Exceções encadeadas Declarando novos tipos de exceções 15.1 Introdução • Tratamento de exceções – Exceção • Indicação de um problema durante a execução – Exemplo: divisão por zero – Exceções encadeadas 15.2 Uma visão geral do tratamento de Exceções • Usos do tratamento de exceções – Processar exceções dos componentes do programa – Tratar as exceções de uma maneira uniforme em projetos grandes – Remover o tratamento de exceções do “fluxo principal” de execução • Um método detecta um erro em lança uma exceção – O código para o tratamento de exceções processa o erro – Exceções não capturadas podem fornecer resultados adversos • Podem terminar a execução do programa 15.2 Uma visão geral do tratamento de Exceções • Código que pode gerar erros deve ser posto em blocos try – O código para o tratamento de erros deve ser posto em cláusulas catch – A cláusula finally sempre é executada • Modelo de terminação no tratamento de exceções – O bloco no qual o tratamento da exceção expira • A cláusula throws especifica as exceções que um método pode lançar 15.3 Um exemplo do tratamento de exceções: divisão por zero • Um erro comum de programação • Arremesa (throws) uma ArithmeticException Method quotient throws ArithmeticException Outline O bloco try Lê os operandos da entrada padrão Tenta a divisão usando o método quociente Catch ArithmeticException Outline 15.4 A hierarquia das exceções em Java • Superclasse Throwable – Subclasse Exception • Situações de erro verificadas em tempo de compilação • Devem ser capturadas pelo programa – Subclasse Error • Tipicamente não capturados pelo programa • Exceções verificadas (Checked exceptions) – É necessário envolvê-las em um bloco try..catch ou usar a cláusula throws na declaração do método • Exceções não verificadas (Unchecked exceptions) Fig. 15.2 A hierarquia de classes para a classe Throwable Throwable Exception RuntimeException IOException Error AWTError ThreadDeath OutOfMemoryError 15.5 Disparando novamente uma exceção • Torne a lançar a exceção se o bloco catch não pode tratá-la inteiramente 15.6 A cláusula finally • Perda de recursos – Ocorre quando os recursos alocados (memória, conexões com o banco de dados, etc.) não são liberados por um programa • O bloco finally – Vem depois dos blocos catch – É sempre executado – Frequentemente usado para liberar recursos Outline Torna a lançar Exception O bloco finally executa mesmo que alguma Exception tenha sido lançada Outline O bloco finally é sempre executado Outline 15.7 Propagação de exceções • Exceções não capturadas no escopo do método onde elas são lançadas – O método termina – A exceção propaga para o método que chamou o método onde ocorreu a exceção – Outra tentativa de capturar a exceção Outline Chama o método lancaExcecoes Captura as exceções lançadas pelo do método lancaExcecoes O método declara uma cláusula throws Lança uma Exception Outline 15.8 Os métodos printStackTrace, getStackTrace e getMessage • A classe Throwable – Método printStackTrace • Imprime a pilha de chamadas de métodos – Método getStackTrace • Provê acesso programático à pilha impressa por printStackTrace(). • Retorna um array contendo os elementos da pilha de chamadas de métodos. Outline Chama metodo1 Imprime as informações geradas pelas chamadas a getMessage e printStackTrace Imprime cada um dos StackTraceElements Chama metodo2 metodo1 declara uma cláusula throw Outline metodo2 declara uma cláusula throw chama metodo3 metodo3 declara uma cláusula throw Levanta uma Exception que propaga em direção a main Outline 15.9 Exceções encadeadas • Encapsula a exceção existente em uma nova exceção – permite manter o histórico dos eventos na pilha Outline Chama metodo1 Captura Exception e imprime o conteúdo da pilha metodo1 declara uma cláusula throw Chama metodo2 Uma Exception existente é encadeada com uma nova exceção Outline metodo2 declara uma cláusula throw Chama metodo3 Uma exceção existente é encadeada com uma nova exceção Lança uma nova Exception Outline 15.10 Declarando novas exceções • Basta herdar de uma exceção existente