Aula 8 Prof. Roberto Rosa [email protected] A partir de agora vamos aprender como ver qual é o erro que está acontecendo em nosso projeto. Para isso, a primeira coisa que precisamos entender é como utilizar os blocos tratadores, no caso o "try catch". Quando criamos um método em alguma linguagem de programação o mesmo pode não estar apto para resolver ou detectar alguma falha que venha a acontecer. As exceções são lançadas para sinalizar alguma falha que tenha ocorrido. Tal lançamento causa uma interrupção abrupta na execução do sistema. A maior parte das linguagens de programação(principalmente as Orientadas a Objetos) tem suporte para a utilização de exceções. O Java, PHP, por exemplo são bons exemplos de linguagens com suporte ao tratamento de Exceções. Também podemos lançar exceções ou criar as nossas próprias exceções. O Java por exemplo nos dá suporte para: Representar uma exceção* Uma forma para lançar a exceção (throw/throws) Uma forma para tratar a exceção (try-catch-finally) *No caso do Java as exceções são representadas por classes. Exceções verificadas subclasse de Exception utilizadas para falhas iniciais onde a recuperação talvez seja possível Exceções não-verificadas subclasse de RuntimeException utilizadas para falhas não-antecipadas onde a recuperação não é possível A classe Throwable é o "vô" de todas as classes que representam um erro ou uma exceção. A partir dele podemos utilizar os principais métodos para saber o que aconteceu de erro, problema, etc. A imagem a seguir ilustra qual é a hierarquia básica das Exceções na linguagem Java em especial. Hierarquia de Exceções Principais métodos No Java são três os principais métodos que relatam a exceção ocorrida, são eles: void printStackTrace(): Lista a seqüência de métodos chamados até o ponto onde aj exceção foi lançada. String getMjessage() - Retorna uma mensagem que indica o que ocorreu na exceção. toString() - Esse método retorna uma breve descrição da exceção que ocorreu. Podemos lançar exceções a partir dos métodos. Para lançar uma exceção a partir de um método deve ser utilizada a cláusula throws, conforme Figura: Podemos lançar exceções a partir dos métodos. Para lançar uma exceção a partir de um método deve ser utilizada a cláusula throws, conforme Figura: Exemplo de lançamento de exceção através da cláusula throws Clientes que capturam uma exceção devem proteger a chamada com um bloco try. Qualquer número de instruções pode ser incluído em um bloco try. A cláusula catch tentará capturar exceções geradas por qualquer instrução dentro do try precedente. Exemplo de blocos tratadores básico Podemos também utilizar na maioria das linguagens 2 ou mais blocos de "catch", conseguindo assim tratar 2 ou mais exceções a partir de um único "try". A figura a seguir mostra como ficaria um "try" com dois tratamentos de exceções especializados e o terceiro é um tratamento de exceção genérico para qualquer tipo de exceção que não se enquadre nos 2 catchs iniciais. Quando ocorre uma exceção, o java procura um bloco tratador adequado. Os "catch" são checados em sequência, ou seja, o primeiro catch que estiver tratando a exceção que ocorreu é executado. Após a execução do catch, se houver outros catchs os mesmos não são executados, porém o software continua com a sua execução normal após o último bloco tratador. Sempre cuide a ordem ao declarar os "catch's". Nunca podemos colocar um bloco catch tratando Exception antes dos tratamentos de outras Exceptions, isso porque Exception é pai de todas as outras exceções. Exemplo de captura com mais de 1 catch No Java a partir do JDK7 é possível a utilização de multi-catch, ou seja, podemos inserir 2 ou mais exceções em um único catch. Exemplo de blocos tratadores com multi-catch Também podemos colocar dentro de um bloco try outro trycatch, fazendo o tratamento de exceções de forma aninhada. Ao tratar de forma aninhada podemos individualizar e especializar as mensagens de erro, fazendo com que o usuário identifique exatamente o que ele realmente errou. A cláusula finally é opcional, ou seja, você pode criar um bloco tratador try-catch sem finally. Se você optar por colocar a instrução finally ela será sempre executada, mesmo que não ocorra uma exceção dentro do bloco try. Se ocorrer uma exceção no try, e não for capturada por nenhum catch, mesmo assim o finally é executado Se ocorrer uma exceção e a mesma for capturadda por algum catch, mesmo assim o finally é executado. Na prática o finally pode e deve ser utilizado para fechar conexões de rede, conexão com o banco de dados, escrita e leitura de arquivos, entre outros. Exemplo de blocos tratadores com finally