Paradigmas de Linguagens de Programação - Tratamento de Exceções

1.653 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
1.653
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1
Ações
Compartilhamentos
0
Downloads
107
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Paradigmas de Linguagens de Programação - Tratamento de Exceções

  1. 1. Prof. Adriano Teixeira de Souza Sistemas de tratamento de exceções Exceções em Java
  2. 2.  Componentes podem ter problemas durante a execução e reagir como: ◦ terminar o programa; ◦ retornar um valor de erro indicando falha; ◦ retornar e ignorar o problema; ◦ chamar uma função para tratar o erro, etc... Problemas: erros e exceções ◦ representam situações anormais (exceções) ou inválidas (erros) durante o processo de execução Componentes robustos: tentam sanar os problemas Prof. Adriano Teixeira de Souza
  3. 3.  Os problemas comuns de execução: ◦ falha na aquisição de um recurso (new, open..) ◦ tentativa de fazer algo impossível (divisão por zero, índice inválido..) ◦ outras condições inválidas (lista vazia, overflow..) classe objeto.metodo() dados método() Prof. Adriano Teixeira de Souza
  4. 4.  Premissas: ◦ Possíveis problemas de execução de um método podem ser antecipados pelo programador ◦ Situações de erro podem ser revertidas Solução ideal ◦ tratamento de problemas separado do código normal ◦ Mecanismo: sistemas de tratamento de exceções (STE) Prof. Adriano Teixeira de Souza
  5. 5.  Mecanismos oferecidos pela LP Um STE deve ser capaz de : ◦ detectar a ocorrência de uma situação anormal de processamento ◦ identificar o tipo de ocorrência e enviar um sinal ao programa (disparar uma exceção) ◦ capturar a exceção em algum ponto do programa ◦ tratar uma exceção em algum ponto do programa (ativar tratador)disparar detectar capturar tratar Prof. Adriano Teixeira de Souza
  6. 6.  Exceções podem ser disparadas de duas maneiras: ◦ Implicitamente, pelo ambiente operacional  o ambiente de execução não consegue executar um comando em um programa ◦ Explicitamente, pelo programa  uma função do programa não consegue prosseguir a execução disparar detectar capturar tratar Prof. Adriano Teixeira de Souza
  7. 7. public class Zero { public static void main ( String[] args){ int numerador = 10; int denominador = 0; System.out.println(numerador/denominador); } // main mensagem} // Zero do JREexecução: java.lang.ArithmeticException: / by zero at Zero.main(Zero.java:xx)xx: número da linha do arquivo fonte onde ocorreu o erro Prof. Adriano Teixeira de Souza
  8. 8.  Indicação da região do programa que deve ser monitorada pelo sistema de tratamento de exceções Sintaxe: try {<bloco de comandos>} Exemplo: comandos que podem disparar exceções try { num= Integer.parseInt(stdin.readLine()); valido = true; }disparar detectar capturar tratar Prof. Adriano Teixeira de Souza
  9. 9.  Um comando catch tem as seguintes funções: capturar um (determinado) tipo de exceção implementar um tratador para aquele tipo de exceção Sintaxe: catch(<tipo><arg>){<comandos>} Exemplo: catch (NumberFormatException exc) { System.out.println(“Entrada invalida. Digite outra”); }disparar detectar capturar tratar Prof. Adriano Teixeira de Souza
  10. 10. try { num= Integer.parseInt(stdin.readLine()); valido = true;}catch (NumberFormatException exc) { System.out.println(“Entrada invalida. Digite outra”);}catch (IOException exc) { System.out.println(“Problema de entrada. Terminando!”); System.exit(0);} Prof. Adriano Teixeira de Souza
  11. 11.  Exceções são objetos, instâncias de alguma sub-classe de java.lang.Throwable ◦ podem conter dados ◦ podem definir métodos Um dos dados é um String inicializado em tempo de criação do objeto, consultado por ◦ Throwable.getMessage() Throwable tem duas sub-classes: Error e Exception. ◦ Exceptions: podem ser capturadas e tratadas ◦ Errors: correspondem a problemas mais graves, que não podem ser recuperados Prof. Adriano Teixeira de Souza
  12. 12.  Instâncias da classe Error e suas extensões ◦ correspondem a problemas mais graves ocorridos no ambiente de execução ◦ conhecidas como exceções não-verificadas Instâncias da classe Exception e suas extensões ◦ podem ser tratadas localmente ◦ conhecidas como exceções verificadas: o compilador “verifica” antes da execução do programa ◦ comandos que disparam exceções verificadas devem ser colocados em um bloco try Prof. Adriano Teixeira de Souza
  13. 13. Exception: hierarquia de exceções Exception java.lang IOException Runtime java.io Exceptioncontexto:java.lang.Object | NumberFormat java.lang.Throwable |java.lang.Exception Exception Prof. Adriano Teixeira de Souza
  14. 14.  Tratar exceções cria um fluxo de controle separado do fluxo normal de execução Abordagens: ◦ tratar a exceção onde ela ocorre ( local) ◦ tratar a exceção em outro ponto do programa tratador de exceção unidade de unidade de chamada execução Prof. Adriano Teixeira de Souza
  15. 15. comando anterior;try { num= Integer.parseInt(stdin.readLine()); valido = true;}catch (NumberFormatException exc) { System.out.println(“Entrada invalida. Digite outra”);}catch (IOException exc) { System.out.println(“Problema de entrada. Terminando!”); System.exit(0);}comando posterior; Prof. Adriano Teixeira de Souza
  16. 16. comando anterior; try { num= Integer.parseInt(stdin.readLine()); valido = true; } catch (NumberFormatException exc) { System.out.println(“Entrada invalida. Digite outra”); }OU catch (IOException exc) { System.out.println(“Problema de entrada. Terminando!”); System.exit(0); } comando posterior; Prof. Adriano Teixeira de Souza
  17. 17. chamada execução método() objeto.metodo() dados• Modelos de implementaçãoTérmino: após a execução do tratador de exceção, a unidade onde ocorreu o erro é terminadaContinuação: após a execução do tratador de exceção, a unidade continua a sua execução Prof. Adriano Teixeira de Souza
  18. 18. A: chamada B: execução método() objeto.metodo() dados tratador no requisitante tratador localHipótese 1: Hipótese 2:- B acusa erro e termina a - B faz tratamento localexecução de erro- A captura o erro e trata a - Caso não consiga recuperarexceção o erro, recai na Hipótese 1 Prof. Adriano Teixeira de Souza
  19. 19.  Para buscar o tratador de exceção: ◦ percorre a ‘cadeia’ de ativações, a partir do ambiente local (pilha de execução) ◦ durante o caminho, são destruídos os objetos criados nos ambientes percorridos (retira da pilha de execução) ◦ se não for encontrado um tratador a exceção a exceção chega ao método main, que termina o programa m2() m1() Ver: método printStackTrace() main() Prof. Adriano Teixeira de Souza
  20. 20.  Sinal emitido pelo programa com a indicação da ocorrência de uma exceção ◦ if (…problema…) throw new IOException( ); Instanciação a partir de uma classe ◦ throw new <classe()> ◦ Exemplo: if (t==null) throw new NullPointerException(); Objeto já instanciado ◦ throw <objeto> ◦ Exception problema = new Exception (“Alerta!”); ◦ Exemplo:.... throw problema; ... Prof. Adriano Teixeira de Souza
  21. 21.  Considerando que: ◦ a unidade de execução pode detectar problemas mas geralmente não sabe como tratá-lo ◦ a unidade requisitante não pode detectar problemas mas geralmente sabe como tratá-los ◦ é conveniente saber quais são as exceções que um método pode disparar para providenciar um tratador Cláusula throws : usada no cabeçalho de um método para indicar que ele propaga a exceção Exemplo: ◦ public Integer(String s) throws NumberFormatException Prof. Adriano Teixeira de Souza
  22. 22.  Para forçar a ocorrência de uma exceção, utiliza-se a palavra reservada throw (no singular)public void metodo1( ) { try { throws (plural) metodo2( ); propaga exceção } catch (IOException e) { System.err.println(e); }} public void metodo2( ) throws IOException { if (…problema…) throw new IOException( ); }
  23. 23. public String readLine()import java.io.*; throws IOExceptionpublic class simplesIO { static BufferedReader stdin=new BufferedReader (new InputStreamReader(System.in)); public static void saida(String ms){ System.out.print (ms); } public static String entrada() throws IOException{ return stdin.readLine(); } public static void linha(){ // exemplo de chamada: System.out.println(); } try{linha=entrada();}}//simplesIO catch(IOException e){} Prof. Adriano Teixeira de Souza
  24. 24. import java.io.*;public class simplesIO { static BufferedReader stdin=new BufferedReader (new InputStreamReader(System.in)); public static void saida(String ms){ System.out.print (ms);} public static String entrada(){ try { String lin= stdin.readLine(); return lin; } catch(IOException){// tratar aqui} } public static void linha(){ System.out.println(); // exemplo de chamada: } linha=entrada();}//simplesIO Prof. Adriano Teixeira de Souza
  25. 25. Exceções definidas pelo usuário Exception java.lang IOException RunTime java.io Exception Minha NumberFormat Exception Exception Prof. Adriano Teixeira de Souza
  26. 26. // definição da exceçãoclass TempExc extends Exception{public TempExc () { super(); } // executa Exception()public TempExc (String s) {System.out.println(s + "n");}}// dispara e propaga exceção try{ metodo();}void metodo() throws TempExc { catch(TempExc e){throw new TempExc(); }} Prof. Adriano Teixeira de Souza
  27. 27. try { .... } catch (Tipo1 exc) { .....} catch (Tipo2 exc) {......} A cláusula finally finally {<bloco de comandos>} ◦ é utilizada para forçar a execução de um bloco de código ◦ associada a um bloco try ◦ pode ser utilizada com ou sem o bloco catch A cláusula finally é executada nas seguintes condições: ◦ fim normal do método ◦ devido a uma instrução return ou break ◦ caso uma exceção tenha sido gerada Prof. Adriano Teixeira de Souza
  28. 28.  Dado o seguinte enunciado: Escreva um programa em JAVA que recebe dois strings, S1 e S2 e um número N pela linha de comando e imprima: ◦ Os N primeiros caracteres do String S1 separados por um “-”; ◦ Os N primeiros caracteres do String S1 de traz para diante; ◦ Os N primeiros caracteres do String S2 separados por um “-”; ◦ Os N primeiros caracteres do String S2 de traz para diante. Prof. Adriano Teixeira de Souza
  29. 29. class ImpString { public class TestaExceptions{ public static void impSep(String str,int n){ static public void main(String args[]){ String aux = ""; String s1,s2; for(int i=0; i<n; i++){ int n; aux = aux + str.charAt(i); if (i < n-1) aux = aux + -; } s1 = args[0]; System.out.println(aux); s2 = args[1]; } n = Integer.parseInt(args[2]);public static void impInv(String str,int n){ String aux = ""; for(int i=n-1; i>=0; i--) ImpString.impSep(s1,n); aux = aux + str.charAt(i); ImpString.impInv(s1,n); System.out.println(aux); ImpString.impSep(s2,n); }} ImpString.impInv(s2,n); } } Prof. Adriano Teixeira de Souza
  30. 30.  A solução anterior está correta se: ◦ O usuário informar os 3 parâmetros na linha de comando; ◦ O terceiro parâmetro for um número; ◦ O valor de N for menor ou igual ao comprimento dos strings informados; O tratamento de situações de erro é fundamental em aplicações reais ! Prof. Adriano Teixeira de Souza
  31. 31.  Exemplo: Entrada: Entrada: Teste exceções 4 Teste exceções 10 Saída: Saída: T-e-s-t java.lang.StringIndexOutOfBoundsEx tseT ception: String index out of range: 5 e-x-c-e ecxeEntrada: Entrada:Teste Teste Teste TesteSaída: Saída:java.lang.NumberFormatExce java.lang.StringIndexOutOfBoundsExcption: Teste eption: 1 Prof. Adriano Teixeira de Souza
  32. 32. public class TestaExceptions{ static public boolean intOk(String s){ for(int i=0; i<s.length(); i++) if (Character.isDigit(s.charAt(i)) == false) return(false); return(true); }public static void main(String args[]){ String s1,s2; Código normal entrelaçado com int n; código excepcional: if (args.length != 3){ acrescentou 14 linhas executáveis System.out.println("Sintaxe: <string> <string> <int>"); System.exit(0); } if (intOk(args[2]) == false){ System.out.println("O terceiro parâmetro deve ser um inteiro"); System.exit(0); } (continua...) Prof. Adriano Teixeira de Souza
  33. 33. (...continua) s1 = args[0]; s2 = args[1]; n = Integer.parseInt(args[2]); if (n < s1.length()){ ImpString.impSep(s1,n); ImpString.impInv(s1,n); } else System.out.println("O valor de n é maior que o tamanho de S1"); if (n < s2.length()){ ImpString.impSep(s2,n); ImpString.impInv(s2,n); } else System.out.println("O valor de n é maior que o tamanho de S2"); }} Prof. Adriano Teixeira de Souza
  34. 34. try{ ImpString.impSep(s1,n);public class TestaExceptions{ ImpString.impInv(s1,n); static public void main(String args[]){ ImpString.impSep(s2,n); String s1=""; ImpString.impInv(s2,n); String s2=""; } int n=0; catch(Exception e){ try{ System.out.println("O valor de N é s1 = args[0]; maior que S1 ou S2"); s2 = args[1]; System.exit(0); n = Integer.parseInt(args[2]); } } } catch(Exception e){ } System.out.println("Sintaxe: <string> <string> <int>"); System.exit(0); } Prof. Adriano Teixeira de Souza
  35. 35. public class TestaExceptions{ catch(NumberFormatException e){ static public void main(String System.out.println("O terceiro argumento deveargs[]){ String s1=""; ser um int"); String s2=""; } catch(IndexOutOfBoundsException e){ int n=0; System.out.println("Sintaxe: <string> <string> try{ <int>"); s1 = args[0]; } catch (Exception e){ s2 = args[1]; System.out.println("O valor de N é maior que S1 n = Integer.parseInt(args[2]); ou S2"); ImpString.impSep(s1,n); }finally{ ImpString.impInv(s1,n); System.out.println(”Sempre passa por aqui !!"); } ImpString.impSep(s2,n); } ImpString.impInv(s2,n); } } Prof. Adriano Teixeira de Souza
  36. 36. class MinhaExcecao extends Exception{ private int val; public MinhaExcecao(int n){ super("Minha excecao: valor de val="+n); val = n; } public int getVal(){ return(val); }}class ImpString { public static void impSep(String str,int n) throws MinhaExcecao{ String aux = ""; if (n == 0) throw(new MinhaExcecao(n)); for(int i=0; i<n; i++){ aux = aux + str.charAt(i); if (i < n-1) aux = aux + -; } System.out.println(aux); } (continua...) Prof. Adriano Teixeira de Souza
  37. 37. public static void impInv(String str,int n){ String aux = ""; for(int i=n-1; i>=0; i--) aux = aux + str.charAt(i); System.out.println(aux); }}public class TestaExceptions{ static public void main(String args[]){ String s1=""; String s2=""; int n=0; try{ s1 = args[0]; s2 = args[1]; n = Integer.parseInt(args[2]); ImpString.impSep(s1,n); ImpString.impInv(s1,n); ImpString.impSep(s2,n); ImpString.impInv(s2,n); } (continua...) Prof. Adriano Teixeira de Souza
  38. 38. (...continua)catch(NumberFormatException e){ System.out.println("O terceiro argumento deve ser um int"); }catch(IndexOutOfBoundsException e){ System.out.println("Sintaxe: <string> <string> <int>"); }catch(MinhaExcecao e){ System.out.println(e.getMessage()); int x = e.getVal(); }catch(Exception e){ System.out.println("O valor de N é maior que S1 ou S2"); } finally{ System.out.println("É obrigado a passar por aqui"); } }} Prof. Adriano Teixeira de Souza

×