Programação Orientada por Objectos - Aula 5

2,062 views

Published on

Aula teórica 5 da unidade (disciplina) de Programação Orientada por Objectivos para os cursos de LIGE, LEI e LETI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.

Published in: Education, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,062
On SlideShare
0
From Embeds
0
Number of Embeds
46
Actions
Shares
0
Downloads
112
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Programação Orientada por Objectos - Aula 5

  1. 1. Aula 5<br />Erros e casos excepcionais: conceitos; representação, criação, detecção e tratamento; boas práticas (e segurança)<br />
  2. 2. Na aula anterior…<br />A infra-estrutura aplicacional de colecções do Java (Java Collections Framework)<br />2009/2010<br />Programação Orientada por Objectos<br />2<br />
  3. 3. Conceitos<br />2009/2010<br />Programação Orientada por Objectos<br />3<br />
  4. 4. Representação e criação<br />Em Java, casos excepcionais, erros de programação e erros no ambiente de execução representam-se através de lançáveis<br />Os lançáveis são criados e lançados<br />Explicitamente: throw<br />Implicitamente: assert<br />Automaticamente: JVM, por exemplo<br />Por métodos sobre os quais não temos controlo<br />2009/2010<br />Programação Orientada por Objectos<br />4<br />
  5. 5. Detecção e tratamento<br />Lançáveis em Java podem ser capturados<br />Para lidar integralmente com um caso excepcional<br />Para lidar parcialmente com um caso excepcional<br />Apenas para “arrumar a casa” , quando não se sabe lidar com um caso excepcional<br />Para terminar o programa de forma adequada em caso de erro de programação ou de erro no ambiente de execução<br />2009/2010<br />Programação Orientada por Objectos<br />5<br />Isto não é uma recuperação, mas sim um elegante harakiri.<br />
  6. 6. Lançáveis Java<br />Usados para representar<br />Casos excepcionais<br />Erros de programação<br />Erros no contexto de execução de um programa<br />São objectos de classes pertencentes à hierarquia com base na classe Throwable<br />São lançáveis através da instrução throw<br />Lançamento interrompe o fluxo normal de um programa<br />Programação Orientada por Objectos<br />2009/2010<br />6<br />
  7. 7. Hierarquia de lançáveis em Java<br />2009/2010<br />Programação Orientada por Objectos<br />7<br />Throwable<br />Casos excepcionais.<br />Erros de programação correspondentes a violação de pré-condições em contratos não privados.<br />Erros no ambiente de execução.<br />Error<br />Exception<br />IOException<br />VirtualMachineError<br />…<br />…<br />RuntimeException<br />AssertionError<br />ArithmeticException<br />Erros de programação (excepto violação de pré-condições em contratos não privados).<br />NullPointerException<br />…<br />
  8. 8. Hierarquia de lançáveis em Java<br />Throwable<br />Error<br />VirtualMachineError<br />…<br />AssertionError<br />Exception<br />IOException<br />…<br />RuntimeException<br />ArithmeticException<br />NullPointerException<br />IndexOutOfBoundsException<br />…<br />Erros de programação (excepto violação de pré-condições em contratos não privados). Criação implícita quando asserção falha. Normalmente irrecuperáveis.<br />Erros de programação correspondentes a violações pré-condições de contratos não privados. Criação explícita. Lançamento com throw. Normalmente irrecuperáveis.<br />2009/2010<br />8<br />Programação Orientada por Objectos<br />Erros no ambiente de execução. Criação automática. Normalmente irrecuperáveis.<br />Casos excepcionais. Criação explícita. Lançamento com throw. Normalmente recuperáveis.<br />
  9. 9. Características<br />2009/2010<br />Programação Orientada por Objectos<br />9<br />Possibilidade de lançamento tem de ser declarada!<br />1 Para aplicações não críticas.<br />2 Excepto RuntimeException e derivadas.<br />3 Para violações de pré-condições em contratos não privados.<br />4 Para todos os restantes casos.<br />5 Excepto AssertionError.<br />
  10. 10. Algumas RuntimeException<br />2009/2010<br />Programação Orientada por Objectos<br />10<br />
  11. 11. Lançamento explícito para caso excepcional<br />public void someMethod(…) throwsSomeException {<br /> …<br /> if (…)<br />throw new SomeException("Informative message");<br /> …<br />}<br />Declaração de possibilidade de lançamento:<br /><ul><li>Obrigatória para Exception (excepto RuntimeException).
  12. 12. Não recomendada para restantes casos (Error e RuntimeException).</li></ul>2009/2010<br />11<br />Programação Orientada por Objectos<br />
  13. 13. Lançamento explícito para erro de programação<br />static public double squareRoot(final double value) {<br /> if (value < 0.0)<br /> throw new IllegalArgumentException(<br /> "Illegal value " + value <br /> + ", should be 0 ≤ value");<br /> …<br />}<br />2009/2010<br />12<br />Programação Orientada por Objectos<br />Violação de pré-condição em contrato não privado.<br />
  14. 14. Delegação ou declaração de passagem (throws)<br />public void someMethod(…) throws SomeException {<br /> …<br />anObject.someOtherMethod(…); <br /> … // only if no exception is thrown.<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />13<br />
  15. 15. Lidando com caso excepcional<br />public void someMethod(…) {<br />try {<br /> …<br />anObject.someOtherMethod(…);<br /> … // only if no exception is thrown.<br /> } catch (final SomeException exception) {<br /> … // fix the problem using information available. <br /> }<br /> … // continue execution.<br />}<br />2009/2010<br />14<br />Programação Orientada por Objectos<br />
  16. 16. Arrumando a casa com finally<br />public void someMethod(…) {<br /> try {<br /> …<br />anObject.someOtherMethod(…);<br /> …<br /> } catch (final SomeException exception) {<br /> …<br /> } finally {<br /> … // clean house in any case.<br /> }<br /> …<br />}<br />2009/2010<br />15<br />Programação Orientada por Objectos<br />Bloco finally executado mesmo no caso de excepções não capturadas, retornos, novos lançamentos, asserções falhadas, etc.<br />
  17. 17. Lidando parcialmente com caso excepcional<br />public void someMethod(…) throws SomeException {<br /> try {<br /> …<br />anObject.someOtherMethod(…);<br /> …<br /> } catch (final SomeException exception) {<br /> … // fix part of the problem using information available.<br /> throw exception;<br /> }<br /> …<br />}<br />2009/2010<br />16<br />Programação Orientada por Objectos<br />Relançamento da excepção capturada.<br />
  18. 18. Informação adicional sobre a ocorrência<br />public void someMethod(…) throws SomeOtherException {<br /> try {<br /> …<br />anObject.someOtherMethod(…);<br /> …<br /> } catch (final SomeException exception) {<br /> … // clean house if necessary.<br /> throw new SomeOtherException(<br /> "Informative message", exception);<br /> }<br /> …<br />}<br />2009/2010<br />17<br />Programação Orientada por Objectos<br />Apenas se se tratar de um caso excepcional.<br />Lançável capturado é a causa do novo lançável.<br />
  19. 19. Captura múltipla<br />public void someMethod(…) {<br />try {<br /> …<br /> } catch (final SomeException exception){<br /> …<br /> } catch (final RuntimeException exception){<br /> …<br /> } catch (final IOException exception){<br /> …<br /> } catch (final Exception exception){<br /> …<br /> }<br /> …<br />}<br />Excepções mais específicas têm de estar primeiro.<br />2009/2010<br />18<br />Programação Orientada por Objectos<br />
  20. 20. Operação printStackTrace<br />publicvoidsomeMethod(…) {<br /> …<br />try {<br /> …<br /> } catch (final SomeExceptionexception) {<br />exception.printStackTrace();<br /> …<br /> }<br /> …<br />}<br />Imprime uma representação da pilha de invocações no momento em que a excepção foi lançada.<br />pt.iscte.dcti.poo.exceptions.SomeException<br />atpt.iscte.dcti.poo.SomeClass.someMethod(SomeClass.java:16)<br />atpt.iscte.dcti.poo.SomeOtherClass.someOtherMethod(SomeOtherClass.java:9)<br />atpt.iscte.dcti.poo.MainClass.main(MainClass.java:36)<br />2009/2010<br />19<br />Programação Orientada por Objectos<br />
  21. 21. Contratos: documentação e verificação<br />/**<br /> * Returns the double closest to the square root of its argument<br /> * value.<br /> *<br /> * @pre 0 ≤ value<br /> * @post …<br /> * @param value the value whose square root will be approximated<br /> * @throws IllegalArgumentException If value < 0<br /> */<br />static public double squareRoot(final double value) {<br /> if(value < 0)<br /> throw new IllegalArgumentException(“Message");<br /> …<br /> assert … : "Informative message";<br /> return result;<br />}<br />2009/2010<br />20<br />Programação Orientada por Objectos<br />As asserções, por omissão, estão desactivadas. Para que tenham algum efeito tem de se executar a JVM com a opção -ea.<br />
  22. 22. Invariante de instância<br />public Rational(final int numerator, <br /> final int denominator) {<br /> if(denominator == 0)<br /> throw new IllegalArgumentException("Message");<br />this.numerator = numerator;<br />this.denominator = denominator;<br /> normalize();<br />checkInvariant();<br />}<br />private void checkInvariant() {<br /> assert 0 < denominator : "…";<br /> assert gcd(numerator, denominator) == 1 : "…";<br />}<br />…<br />Onde? No final dos construtores, no início de métodos não modificadores e no início e no fim de métodos modificadores.<br />O invariante de instância é a condição que todas as instâncias de uma classe têm de verificar para que estejam num estado correcto.<br />2009/2010<br />21<br />Programação Orientada por Objectos<br />
  23. 23. Métodos privados<br />private void reduce() {<br /> assert denominator != 0;<br /> if (denominator < 0) {<br /> denominator = -denominator;<br /> numerator = -numerator;<br /> }<br /> final intgcd = gcd(numerator, denominator);<br /> numerator /= gcd;<br /> denominator /= gcd;<br /> assert mdc(numerator, denominator) == 1 : "…";<br /> assert 0 < denominator : "…";<br />}<br />2009/2010<br />Programação Orientada por Objectos<br />22<br />Pré-condição de método privado (parte da implementação da classe) verificada com asserção.<br />Nos métodos privados não se verifica o invariante de instância, pelo menos enquanto tal.<br />
  24. 24. Lançáveis definidos pelo programador<br />public class SomeException extends Exception {<br /> public Exception() {<br /> }<br /> public Exception(final String message) {<br /> super(message);<br /> }<br /> public Exception(final String message,<br /> final Throwable cause) {<br /> super(message, cause);<br /> }<br /> public Exception(final Throwable cause) {<br /> super(cause);<br /> }<br />}<br />2009/2010<br />23<br />Programação Orientada por Objectos<br />
  25. 25. Boas práticas<br />Distinga claramente a natureza dos erros e casos excepcionais<br />Lide com cada ocorrência usando os mecanismos adequados (e convencionais) à sua natureza<br />2009/2010<br />Programação Orientada por Objectos<br />24<br />
  26. 26. Boas práticas<br />Use assert apenas para erros de programação<br />Pré-condições de métodos privados<br />Pós-condições<br />Invariantes de instância<br />Asserções propriamente ditas<br />Use throw<br />Para erros de programação<br />Pré-condições de métodos não privados<br />Casos excepcionais<br />2009/2010<br />25<br />Programação Orientada por Objectos<br />
  27. 27. Boas práticas<br />Não tente recuperar de uma ocorrência sem antes perceber a sua causa<br />Não desactive as asserções durante a operação normal do softwaresenão quando tiverem um impacte negativo significativo sobre o seu desempenho<br />Tente recorrer a lançáveis já existentes na biblioteca padrão do Java<br />2009/2010<br />Programação Orientada por Objectos<br />26<br />
  28. 28. Boas práticas<br />Documente possibilidade de lançamento de deRuntimeException (e classes derivadas) quando esse lançamento puder ocorrer devido erros na utilização da interface da operação<br />Lembre-se que pode capturar um lançável e lançar um outro que torne mais claro qual o problema (não deve abusar desta estratégia)<br />2009/2010<br />Programação Orientada por Objectos<br />27<br />
  29. 29. Boas práticas: segurança<br />Escreva o seu código de modo a que o lançamento de um lançável num método deixe o programa no mesmo estado em que estava antes da operação correspondente ser invocada<br />Se isso não for possível, escreva o código de modo a, pelo menos, deixar todos os objectos num estado válido<br />2009/2010<br />Programação Orientada por Objectos<br />28<br />
  30. 30. Boas práticas: testes<br />Para cada unidade (classe ou conjunto de classes intimamente ligadas) crie um caso de teste JUnit<br />Crie os testes antes mesmo de começar a desenhar a unidade: pensar nos testes ajuda a perceber melhor que interface deve ter a unidade<br />Teste sempre as situações limite e casos especiais (referências nulas, cadeias de caracteres vazias, valores numéricos no limite, etc.)<br />2009/2010<br />29<br />Programação Orientada por Objectos<br />
  31. 31. Boas práticas: testes<br />Lembre-se que os testes se devem basear apenas na interface não privada da unidade (testes de caixa preta)<br />Evite alterar a interface não privada quando fizer alterações a uma unidade<br />Se precisar de alterar a interface não privada de uma unidade, actualize todos testes e reveja todos os contratos e respectiva documentação<br />Quando alterar a implementação de uma unidade, reveja o seu invariante e execute todos os seus testes<br />2009/2010<br />30<br />Programação Orientada por Objectos<br />
  32. 32. A reter…<br />Detecção e tratamento de ocorrências fundamental para boa programação<br />Princípio subjacente à programação em linguagens como o Java é que quanto mais cedo se detectarem erros, mais fácil é corrigi-los e menor o seu impacte<br />Asserções usam-se para expressar condições que devem ser verdadeiras para que o programa esteja correcto<br />Asserções antecipam detecção de erros de programação e melhoram sua localização<br />2009/2010<br />31<br />Programação Orientada por Objectos<br />
  33. 33. A reter…<br />A relação das excepções declaradas com a operação em causa deve ser clara e deve ser documentada<br />Detecção de erro de programação ou de erro no ambiente de execução do programa deve levar sistema, se não crítico, a cometer um elegante harakiri, tão simpático para utilizadores quanto possível<br />Um programa honrado percebe quando falha e extingue-se voluntariamente, não deixando que erros se propaguem<br />2009/2010<br />Programação Orientada por Objectos<br />32<br />
  34. 34. A ler para as próximas aulas ...<br />Capítulo 18 do livro:<br />Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-0<br />2009/2010<br />Programação Orientada por Objectos<br />33<br />
  35. 35. Sumário<br />Erros e casos excepcionais<br />Conceitos<br />Excepções <br />Erros de programação<br />Erros no ambiente de execução<br />Representação, criação, detecção e tratamento<br />Excepções Java<br />Asserções Java<br />Boas práticas (incluindo segurança)<br />2009/2010<br />Programação Orientada por Objectos<br />34<br />

×