130 likes | 250 Views
Paradigmas da Programação – Semestre 1 – Aula 10. Professor: Eduardo Mantovani (eduardo.mantovani@aes.edu.br). Tratamento de exceções. Exceção: o que foge à regra. POO: Programa-se a regra. As exceções devem ser tratadas independentemente.
E N D
Paradigmas da Programação – Semestre 1 – Aula 10 Professor: Eduardo Mantovani (eduardo.mantovani@aes.edu.br)
Tratamento de exceções • Exceção: o que foge à regra. • POO: Programa-se a regra. As exceções devem ser tratadas independentemente. • Algumas exceções são percebidas pelo próprio processador (ou pela JVM) (divisão por zero, fim de arquivo, utilização de ponteiros nulos, etc...), enquanto outras podem ser condições criadas e detectadas pelo próprio software desenvolvido (cliente não encontrado, CPF inválido, etc...) • Um software desenvolvido em uma LPOO tem recursos para prever e tratar cada tipo de exceção possível • Com o correto tratamento de exceções, um software pode ficar robusto e resistente a falhas, o que é desejável
Arquitetura do tratamento de exceções em POO • Método tradicional: prever o “erro” e dar a volta, evitando que os mesmo aconteça: if (x == 0) printf(“X não pode ser ZERO”); else y = z/x; • Com o tratamento de exceções, a exceção (não é um “erro”) é detectada e transfere a execução para outro ponto. Dessa maneira, o código principal fica enxuto e de mais fácil compreensão: y = z/x;
Lançamento de exceções • Na POO, uma exceção é um objeto (oriundo de uma classe adequada), que traz com ele os detalhes da situação que a gerou. • Quando uma exceção é lançada, fica claro que o processo iniciado pelo chamador não foi concluido com êxito (o método que estava em execução quando ocorreu a exceção não é concluido) e o ponteiro de execução retorna para um ponto especial, onde a situação será tratada. • O mecanismo de exceções independe do tipo de retorno do método em que ocorre a exceção. • As linguagens em que há tratamento de exceções geralmente são dotadas de uma hierarquia de classes que especializa as diferentes situações de exceção, permitindo o tratamento diferenciado para cada caso. Isso é válido para Java, C++, C#, Object Pascal (Delphi), etc...
Hierarquia de classes de exceções em Java • Uma parte da hierarquia de exceções é apresentada a seguir: Throwable Exception Error RuntimeException IOException ArrayIndexOutOfBoundsException NullPointerException ArithmeticException
Hierarquia de exceções em Java: detalhamento • Classe raiz: Throwable (generaliza todas as exceções e erros possíveis) • Error: exceções não tratáveis, ou erros. Falta de recursos (memória, disco, etc...) são exemplo de ocasião onde ocorrem. Tratamento é limitado. • Exception: exceções tratáveis • RunTimeException: exceções não verificadas • Demais descendentes de Exception: exceções verificadas
Exceções verificadas x não verificadas • Exceções verificadas demandam o tratamento de maneira compulsória. Se um método lança uma exceção verificada, essa deve ser obrigatoriamente tratada pelo programador no momento que o método seja utilizado. • Exceções não verificadas ocorrem, basicamente, por detecção automática do processador e seu tratamento não é obrigatório. Acesso a ponteiros nulos, divisão por zero, acesso a elementos de vetores além dos limites, etc...
Processo de tratamento de exceções • O processo de tratamento de exceções em Java é, basicamente, similar ao seguinte código: try { // código que pode gerar a(s) exceção(ões) } catch(Exception e) // captura a exceção { // tratamento para a exceção } finally { // execução independente da ocorrência de exceções } • No exemplo, qualquer exceção que derive de Exception será capturada
Processo de tratamento de exceções especializadas • É possível utilizar exceções especializadas e fazer o tratamento diferenciado para cada exceção que possa ocorrer try { // código que pode gerar a(s) exceção(ões) } catch(NullPointerException e) // captura a exceção { // tratamento para a exceção de ponteiro nulo } catch(ArithmeticException e) // captura a exceção { // tratamento para a exceção de aritmética (divisão/zero) }
Lançamento/Repasse de exceções (Java) • Para os casos em que a exceção é devida a uma situação prevista pelo software, pode haver o lançamento da exceção programado • Para os casos em que o programador prefere que a exceção seja tratada por outro método, uma exceção ocorrida pode ser relançada/repassada • Para as duas situações, utiliza-se as palavras reservadas throw / throws
Lançamento de exceções (throw) • O programador pode determinar uma situação em que a lógica de seu método indique uma exceção e lançar essa exceção naquele ponto • A sintaxe de uso de throw, nesse caso é: throw new <<Classe de exceção>>(<<Parâmetros>>); • Exemplo: throw new ArithmeticException();
Repasse de exceções • Quando uma exceção ocorre e o programador decide que ela será relançada pelo método indicando com throws a exceção que poderá ser relançada, na assinatura do método • Dessa forma, não haverá bloco try...catch para tratamento da exceção neste ponto e sim no chamador de tal método • Exemplo: public void ping(String ip) throws IOException, InterruptedException { Runtime rt = Runtime.getRuntime(); // lança as exceções indicadas // são verificadas! Process p = rt.exec("ping " + ip); int result = p.waitFor(); System.out.println(result); }
Definição de classes de exceção especializadas • É possível criar novas classes de exceção que se adaptam às necessidades do software em desenvolvimento • Para isso, basta que a nova classe herde (seja uma extensão) de qualquer classe derivada de Exception • Exemplo: public class CPFInvalidoException extends Exception { ... }