SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
Python:
Exceções, Iteradores e Geradores



          Claudio Esperança
Exceções
 Quando um programa encontra dificuldades não
  previstas, diz-se que uma condição excepcional ou uma
  exceção ocorreu
      Um erro é uma exceção mas nem toda exceção é um erro
 Para poder representar tais eventos, Python define os
  chamados objetos de exceção (exception objects)
 Se a condição excepcional não é prevista (e tratada), o
  programa termina com uma mensagem de rastreamento:
   >>> 1/0

   Traceback (most recent call last):
     File "<pyshell#0>", line 1, in -toplevel-
       1/0
   ZeroDivisionError: integer division or modulo by
     zero
Objetos de Exceção
 Cada exceção individual corresponde a um objeto de
  exceção, que por sua vez é uma instância de alguma
  classe de exceção
      No exemplo anterior, tal objeto é instância da classe
       ZeroDivisionError
 Diz-se que o programa gerou ou levantou (raised, em
  inglês) uma condição de exceção na forma de um objeto
 Um programa bem elaborado precisa capturar (catch, em
  inglês) tais objetos e tratá-los para que a execução não
  seja abortada
Avisos
 Existem condições excepcionais menos sérias que não
  provocam o levantamento de um objeto de exceção, mas
  apenas são exibidas sob a forma de um aviso
 Por exemplo,
   >>> import regex

   Warning (from warnings module):
     File "__main__", line 1
   DeprecationWarning: the regex module is
     deprecated; please use the re module
 Neste caso, o intepretador nos sinaliza que o módulo regex é antigo e
  que foi substituido por outro mais atualizado chamado re
 O programa não falha, mas o programador fica ciente que
  provamelmente deve reescrever seu programa usando o módulo re
  para evitar obsolecência
O comando raise
 Para sinalizar a ocorrência de uma condição excepcional,
  pode-se usar o comando raise que tem uma das formas:
      raise classe
      raise classe, mensagem
      raise classe (mensagem)
 Onde classe é uma das classes de exceção definidas
  pelo Python
      Para saber todos os tipos de exceção consulte o manual
      Se quiser uma classe genérica use a classe Exception
      Uma listagem pode ser obtida escrevendo
        >>> import exceptions
        >>> dir(exceptions)
        ['ArithmeticError', 'AssertionError',
          'AttributeError', ...
Exemplo
>>> raise Exception

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in -toplevel-
    raise Exception
Exception
>>> raise Exception,"Deu bode"

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in -toplevel-
    raise Exception,"Deu bode"
Exception: Deu bode
>>> raise Exception("Deu Bode")

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in -toplevel-
    raise Exception("Deu Bode")
Exception: Deu Bode
Algumas Classes de Exceção
Criando uma Classe de Exceção
 Basta criar uma classe da forma habitual derivando-a da
  classe Exception
 Não é preciso redefinir qualquer método
 Ex.:
   >>> class MinhaExcecao(Exception): pass

   >>> raise MinhaExcecao("Deu bode!")

   Traceback (most recent call last):
     File "<pyshell#11>", line 1, in -toplevel-
       raise MinhaExcecao("Deu bode!")
   MinhaExcecao: Deu bode!
Capturando Exceções
 Para capturar uma exceção possivelmente levantada por um trecho
  de código, pode-se usar a construção try/except:
   try:
       Código
   except Exceções:
       Código de tratamento da exceção
 Sendo que Exceções pode ser:
    Classe
    Classe,var
    (Classe1,...,ClasseN)
    (Classe1,...,ClasseN),var
 Onde:
    Classe, Classe1 e ClasseN são nomes de classes de exceção
    Var é uma variável à qual é atribuída um objeto de exceção
Exemplo 1
>>> try:
  a = input("Entre com um numero ")
  b = input("Entre com outro numero ")
  print a, "/", b, "=", a/b
except ZeroDivisionError:
  print "Ooops, segundo numero não pode ser zero!"



Entre com um numero 1
Entre com outro numero 0
1 / 0 = Ooops, segundo numero não pode ser zero!
Exemplo 2
>>> try:
  a = input("Entre com um numero ")
  b = input("Entre com outro numero ")
print a, "/", b, "=", a/b
  except (ZeroDivisionError,TypeError):
  print "Ooops, tente novamente!"

Entre com um numero 1
Entre com outro numero "a"
1 / a = Ooops, tente novamente!
Exemplo 3
>>> try:
  a = input("Entre com um numero ")
  b = input("Entre com outro numero ")
print a, "/", b, "=", a/b
  except (ZeroDivisionError,TypeError),e:
  print "Ooops, deu erro:",e

Entre com um numero 1
Entre com outro numero "z"
1 / z = Ooops, deu erro: unsupported operand
  type(s) for /: 'int' and 'str'
Mais except
 É possível tratar diferentemente as diversas exceções
  usando 2 ou mais cláusulas except
 Se quisermos nos prevenir contra qualquer tipo de erro,
  podemos usar uma cláusula except sem nome de classe
      Outra opção é usar a classe Exception que é base para
       todas as exceções e portanto casa com qualquer exceção
 Se não queremos tratar um erro em uma cláusula
  except, podemos passá-la adiante usando o comando
  raise
      Nesse caso, podemos usar um raise sem argumentos ou
       passar explicitamente um objeto de exceção
Exemplo 4
>>> try:
  a = input("Entre com um numero ")
  b = input("Entre com outro numero ")
  print a, "/", b, "=", a/b
except ZeroDivisionError:
  print "Ooops, divisão por zero"
except TypeError:
  print "Ooops, você não deu um número"
except:
  print "Deu um bode qualquer"



Entre com um numero 2
Entre com outro numero fads2312
Deu um bode qualquer
Exemplo 5
>>> try:
   a = input("Entre com um numero ")
   b = input("Entre com outro numero ")
   print a, "/", b, "=", a/b
except (ZeroDivisionError,TypeError),e:
   print "Ooops, deu erro:",e
except Exception,e:
   print "Deu bode não previsto:",e
   raise

Entre com um numero a
Entre com outro numero
Deu bode não previsto: EOF when reading a line

Traceback (most recent call last):
  File "<pyshell#52>", line 3, in -toplevel-
    b = input("Entre com outro numero ")
EOFError: EOF when reading a line
A cláusula else
 É possível completar um comando try com uma cláusula
  else que introduz um trecho de código que só é
  executado quando nenhuma exceção ocorre:
   try:
      Código
   except Exceções:
      Código de tratamento da exceção
   else:
      Código executado se não ocorrem exceções
Exemplo 6
>>> while True:
   try:
      a = input("Entre com um numero ")
      b = input("Entre com outro numero ")
      print a, "/", b, "=", a/b
   except Exception,e:
      print "Deu bode:",e
      print "Tente novamente"
   else:
      break

Entre com um numero 1
Entre com outro numero xxx
Deu bode: name 'xxx' is not defined
Tente novamente
Entre com um numero 1
Entre com outro numero 2
1 / 2 = 0
A cláusula finally
 A cláusula finally pode ser usada para se assegurar
  que mesmo que ocorra algum erro, uma determinada
  seqüência de comandos vai ser executada
      Pode ser usada para restabelecer alguma variável para um
       valor default, por exemplo
 Até a versão 2.4 do python, as cláusula finally e
  except eram mutuamente exclusivas
      Exceções nesse caso não eram tratadas
      Era possível combinar ambas usando comandos try
       aninhados
Exemplo 7 (Python 2.5)

>>> try:
...    x = input("Entre com um número")
... except:
...    print "Deu Bode"
... finally:
...    print "restabelecendo um valor para x"
...    x = None
...
Entre com um número 1xx
Deu Bode
restabelecendo um valor para x
Exemplo 7 (Python 2.4)

>>> try:
...    try:
...       x = input("Entre com um número")
...    finally:
...       print "restabelecendo um valor para x"
...       x = None
... except:
...    print "Deu Bode"
...
Entre com um número 1xx
restabelecendo um valor para x
Deu Bode
Iteradores
 São maneiras genéricas de implementar iterações com
  classes
      Permite o uso do comando for
      É muitas vezes mais econômico do que usar uma lista pois
       não é preciso armazenar todos os valores, mas apenas
       computar um por vez
 Um iterador é uma classe que implementa o método
  mágico __iter__
      É um método que, por sua vez, retorna um objeto que
       implementa um método chamado next
           O método next deve retornar o “próximo” valor a ser iterado
           Se não há próximo valor, next deve “levantar” a exceção
            StopIteration
Exemplo
>>> class MeuIterador:
       a = 0
       def __iter__(self): return self
       def next(self):
           if self.a>10: raise StopIteration
           self.a += 1
           return self.a

>>> iter = MeuIterador()
>>> for i in iter:
print i,

1 2 3 4 5 6 7 8 9 10 11
Geradores
 Geradores são funções especiais que retornam iteradores
 Em resumo, uma função geradora é uma que contém a o
  comando yield valor
 Uma função geradora normalmente é chamada para
  obter o iterador para um comando for
      O comando for automaticamente iterará sobre todos os
       valores que yield “retorna”
      Observe que o iterador produzido pela função geradora
       é tal que o código que gera os valores e o código
       dentro do for se sucedem alternadamente
 Geradores são especialmente úteis em códigos
  recursivos
Exemplo
>>> def gerador():
       for i in range(10):
          print "i = ", i
          yield i


>>> for j in gerador():
       print "j = ",j

i =    0
j =    0
i =    1
j =    1
....
i =    9
j =    9

Contenu connexe

Tendances

Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos JavaMarcio Marinho
 
Java: Excecoes e Tratamento de Erros
Java: Excecoes e Tratamento de ErrosJava: Excecoes e Tratamento de Erros
Java: Excecoes e Tratamento de ErrosArthur Emanuel
 
Memory allocation in c
Memory allocation in cMemory allocation in c
Memory allocation in cPrabhu Govind
 
Exception handling c++
Exception handling c++Exception handling c++
Exception handling c++Jayant Dalvi
 
Basic i/o & file handling in java
Basic i/o & file handling in javaBasic i/o & file handling in java
Basic i/o & file handling in javaJayasankarPR2
 
Improving Automated Tests with Fluent Assertions
Improving Automated Tests with Fluent Assertions Improving Automated Tests with Fluent Assertions
Improving Automated Tests with Fluent Assertions TestingCR
 
Decorators in Python
Decorators in PythonDecorators in Python
Decorators in PythonBen James
 
Exception handling in Java
Exception handling in JavaException handling in Java
Exception handling in JavaAnkit Rai
 
Function arguments In Python
Function arguments In PythonFunction arguments In Python
Function arguments In PythonAmit Upadhyay
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with GroovyArturo Herrero
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2Rogerio Oliveira
 
Functions and modules in python
Functions and modules in pythonFunctions and modules in python
Functions and modules in pythonKarin Lagesen
 
Java Course 8: I/O, Files and Streams
Java Course 8: I/O, Files and StreamsJava Course 8: I/O, Files and Streams
Java Course 8: I/O, Files and StreamsAnton Keks
 

Tendances (20)

Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos Java
 
Apresentação Linguagem C
Apresentação Linguagem CApresentação Linguagem C
Apresentação Linguagem C
 
Java: Excecoes e Tratamento de Erros
Java: Excecoes e Tratamento de ErrosJava: Excecoes e Tratamento de Erros
Java: Excecoes e Tratamento de Erros
 
C++ programming function
C++ programming functionC++ programming function
C++ programming function
 
Memory allocation in c
Memory allocation in cMemory allocation in c
Memory allocation in c
 
Exception handling c++
Exception handling c++Exception handling c++
Exception handling c++
 
Basic i/o & file handling in java
Basic i/o & file handling in javaBasic i/o & file handling in java
Basic i/o & file handling in java
 
Improving Automated Tests with Fluent Assertions
Improving Automated Tests with Fluent Assertions Improving Automated Tests with Fluent Assertions
Improving Automated Tests with Fluent Assertions
 
Apostila de vb
Apostila de vbApostila de vb
Apostila de vb
 
Decorators in Python
Decorators in PythonDecorators in Python
Decorators in Python
 
Python Functions
Python   FunctionsPython   Functions
Python Functions
 
Exception handling in Java
Exception handling in JavaException handling in Java
Exception handling in Java
 
C function presentation
C function presentationC function presentation
C function presentation
 
Function arguments In Python
Function arguments In PythonFunction arguments In Python
Function arguments In Python
 
Functional Programming with Groovy
Functional Programming with GroovyFunctional Programming with Groovy
Functional Programming with Groovy
 
Apresentação recursividade rev2
Apresentação recursividade rev2Apresentação recursividade rev2
Apresentação recursividade rev2
 
Constructor
ConstructorConstructor
Constructor
 
Functions and modules in python
Functions and modules in pythonFunctions and modules in python
Functions and modules in python
 
C# String
C# StringC# String
C# String
 
Java Course 8: I/O, Files and Streams
Java Course 8: I/O, Files and StreamsJava Course 8: I/O, Files and Streams
Java Course 8: I/O, Files and Streams
 

Similaire à Programando em python excecoes

Similaire à Programando em python excecoes (20)

10 programando em python - excecoes
 10   programando em python - excecoes 10   programando em python - excecoes
10 programando em python - excecoes
 
Excecoes
ExcecoesExcecoes
Excecoes
 
Introdução à Linguagem Ruby
Introdução à Linguagem RubyIntrodução à Linguagem Ruby
Introdução à Linguagem Ruby
 
Linguagens de Programação II - Aula 3
Linguagens de Programação II - Aula 3Linguagens de Programação II - Aula 3
Linguagens de Programação II - Aula 3
 
Exceptions Em Java UFF
Exceptions Em Java UFFExceptions Em Java UFF
Exceptions Em Java UFF
 
Programação Defensiva
Programação DefensivaProgramação Defensiva
Programação Defensiva
 
Paradigmas de Linguagens de Programação - Tratamento de Exceções
Paradigmas de Linguagens de Programação - Tratamento de ExceçõesParadigmas de Linguagens de Programação - Tratamento de Exceções
Paradigmas de Linguagens de Programação - Tratamento de Exceções
 
Excepções JAVA
Excepções JAVAExcepções JAVA
Excepções JAVA
 
Repetições e vetores
Repetições e vetoresRepetições e vetores
Repetições e vetores
 
Excecoes em Java
Excecoes em JavaExcecoes em Java
Excecoes em Java
 
PowerShell
PowerShellPowerShell
PowerShell
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência Java
 
Programação orientada a objetos - IV
Programação orientada a objetos - IVProgramação orientada a objetos - IV
Programação orientada a objetos - IV
 
Programando em python - Classes
Programando em python -  ClassesProgramando em python -  Classes
Programando em python - Classes
 
Certificação Java: Exceções
Certificação Java: ExceçõesCertificação Java: Exceções
Certificação Java: Exceções
 
007 programando em python - funcoes
007   programando em python - funcoes007   programando em python - funcoes
007 programando em python - funcoes
 
Java 13 Excecoes
Java 13 ExcecoesJava 13 Excecoes
Java 13 Excecoes
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
Erros, exceções e asserções
Erros, exceções e asserçõesErros, exceções e asserções
Erros, exceções e asserções
 
ASP.Net Módulo 2
ASP.Net   Módulo 2ASP.Net   Módulo 2
ASP.Net Módulo 2
 

Plus de samuelthiago

Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_vsamuelthiago
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_ivsamuelthiago
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iiisamuelthiago
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_iisamuelthiago
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_isamuelthiago
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iisamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_javasamuelthiago
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_jsamuelthiago
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)samuelthiago
 

Plus de samuelthiago (20)

Eclipse i (1)
Eclipse i (1)Eclipse i (1)
Eclipse i (1)
 
Html básico
Html básicoHtml básico
Html básico
 
Interface grafica em_java_parte_v
Interface grafica em_java_parte_vInterface grafica em_java_parte_v
Interface grafica em_java_parte_v
 
Interface grafica em_java_parte_iv
Interface grafica em_java_parte_ivInterface grafica em_java_parte_iv
Interface grafica em_java_parte_iv
 
Interface grafica em_java_parte_iii
Interface grafica em_java_parte_iiiInterface grafica em_java_parte_iii
Interface grafica em_java_parte_iii
 
Interface grafica em_java_parte_ii
Interface grafica em_java_parte_iiInterface grafica em_java_parte_ii
Interface grafica em_java_parte_ii
 
Interface grafica em_java_parte_i
Interface grafica em_java_parte_iInterface grafica em_java_parte_i
Interface grafica em_java_parte_i
 
Poo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_iiPoo interacao entre_objetos_blue_j_ii
Poo interacao entre_objetos_blue_j_ii
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
Projeto calculadora em_java
Projeto calculadora em_javaProjeto calculadora em_java
Projeto calculadora em_java
 
Introducao a poo_com_blue_j
Introducao a poo_com_blue_jIntroducao a poo_com_blue_j
Introducao a poo_com_blue_j
 
01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)01 02 introdução aos bancos de dados (slides)
01 02 introdução aos bancos de dados (slides)
 
Java 08
Java 08Java 08
Java 08
 
Java 07
Java 07Java 07
Java 07
 
Java 06
Java 06Java 06
Java 06
 
Java 05
Java 05Java 05
Java 05
 
Java 04
Java 04Java 04
Java 04
 
Java 03
Java 03Java 03
Java 03
 
Java 02
Java 02Java 02
Java 02
 
Java 01
Java 01Java 01
Java 01
 

Programando em python excecoes

  • 1. Python: Exceções, Iteradores e Geradores Claudio Esperança
  • 2. Exceções  Quando um programa encontra dificuldades não previstas, diz-se que uma condição excepcional ou uma exceção ocorreu  Um erro é uma exceção mas nem toda exceção é um erro  Para poder representar tais eventos, Python define os chamados objetos de exceção (exception objects)  Se a condição excepcional não é prevista (e tratada), o programa termina com uma mensagem de rastreamento: >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in -toplevel- 1/0 ZeroDivisionError: integer division or modulo by zero
  • 3. Objetos de Exceção  Cada exceção individual corresponde a um objeto de exceção, que por sua vez é uma instância de alguma classe de exceção  No exemplo anterior, tal objeto é instância da classe ZeroDivisionError  Diz-se que o programa gerou ou levantou (raised, em inglês) uma condição de exceção na forma de um objeto  Um programa bem elaborado precisa capturar (catch, em inglês) tais objetos e tratá-los para que a execução não seja abortada
  • 4. Avisos  Existem condições excepcionais menos sérias que não provocam o levantamento de um objeto de exceção, mas apenas são exibidas sob a forma de um aviso  Por exemplo, >>> import regex Warning (from warnings module): File "__main__", line 1 DeprecationWarning: the regex module is deprecated; please use the re module  Neste caso, o intepretador nos sinaliza que o módulo regex é antigo e que foi substituido por outro mais atualizado chamado re  O programa não falha, mas o programador fica ciente que provamelmente deve reescrever seu programa usando o módulo re para evitar obsolecência
  • 5. O comando raise  Para sinalizar a ocorrência de uma condição excepcional, pode-se usar o comando raise que tem uma das formas:  raise classe  raise classe, mensagem  raise classe (mensagem)  Onde classe é uma das classes de exceção definidas pelo Python  Para saber todos os tipos de exceção consulte o manual  Se quiser uma classe genérica use a classe Exception  Uma listagem pode ser obtida escrevendo >>> import exceptions >>> dir(exceptions) ['ArithmeticError', 'AssertionError', 'AttributeError', ...
  • 6. Exemplo >>> raise Exception Traceback (most recent call last): File "<pyshell#3>", line 1, in -toplevel- raise Exception Exception >>> raise Exception,"Deu bode" Traceback (most recent call last): File "<pyshell#5>", line 1, in -toplevel- raise Exception,"Deu bode" Exception: Deu bode >>> raise Exception("Deu Bode") Traceback (most recent call last): File "<pyshell#7>", line 1, in -toplevel- raise Exception("Deu Bode") Exception: Deu Bode
  • 7. Algumas Classes de Exceção
  • 8. Criando uma Classe de Exceção  Basta criar uma classe da forma habitual derivando-a da classe Exception  Não é preciso redefinir qualquer método  Ex.: >>> class MinhaExcecao(Exception): pass >>> raise MinhaExcecao("Deu bode!") Traceback (most recent call last): File "<pyshell#11>", line 1, in -toplevel- raise MinhaExcecao("Deu bode!") MinhaExcecao: Deu bode!
  • 9. Capturando Exceções  Para capturar uma exceção possivelmente levantada por um trecho de código, pode-se usar a construção try/except: try: Código except Exceções: Código de tratamento da exceção  Sendo que Exceções pode ser:  Classe  Classe,var  (Classe1,...,ClasseN)  (Classe1,...,ClasseN),var  Onde:  Classe, Classe1 e ClasseN são nomes de classes de exceção  Var é uma variável à qual é atribuída um objeto de exceção
  • 10. Exemplo 1 >>> try: a = input("Entre com um numero ") b = input("Entre com outro numero ") print a, "/", b, "=", a/b except ZeroDivisionError: print "Ooops, segundo numero não pode ser zero!" Entre com um numero 1 Entre com outro numero 0 1 / 0 = Ooops, segundo numero não pode ser zero!
  • 11. Exemplo 2 >>> try: a = input("Entre com um numero ") b = input("Entre com outro numero ") print a, "/", b, "=", a/b except (ZeroDivisionError,TypeError): print "Ooops, tente novamente!" Entre com um numero 1 Entre com outro numero "a" 1 / a = Ooops, tente novamente!
  • 12. Exemplo 3 >>> try: a = input("Entre com um numero ") b = input("Entre com outro numero ") print a, "/", b, "=", a/b except (ZeroDivisionError,TypeError),e: print "Ooops, deu erro:",e Entre com um numero 1 Entre com outro numero "z" 1 / z = Ooops, deu erro: unsupported operand type(s) for /: 'int' and 'str'
  • 13. Mais except  É possível tratar diferentemente as diversas exceções usando 2 ou mais cláusulas except  Se quisermos nos prevenir contra qualquer tipo de erro, podemos usar uma cláusula except sem nome de classe  Outra opção é usar a classe Exception que é base para todas as exceções e portanto casa com qualquer exceção  Se não queremos tratar um erro em uma cláusula except, podemos passá-la adiante usando o comando raise  Nesse caso, podemos usar um raise sem argumentos ou passar explicitamente um objeto de exceção
  • 14. Exemplo 4 >>> try: a = input("Entre com um numero ") b = input("Entre com outro numero ") print a, "/", b, "=", a/b except ZeroDivisionError: print "Ooops, divisão por zero" except TypeError: print "Ooops, você não deu um número" except: print "Deu um bode qualquer" Entre com um numero 2 Entre com outro numero fads2312 Deu um bode qualquer
  • 15. Exemplo 5 >>> try: a = input("Entre com um numero ") b = input("Entre com outro numero ") print a, "/", b, "=", a/b except (ZeroDivisionError,TypeError),e: print "Ooops, deu erro:",e except Exception,e: print "Deu bode não previsto:",e raise Entre com um numero a Entre com outro numero Deu bode não previsto: EOF when reading a line Traceback (most recent call last): File "<pyshell#52>", line 3, in -toplevel- b = input("Entre com outro numero ") EOFError: EOF when reading a line
  • 16. A cláusula else  É possível completar um comando try com uma cláusula else que introduz um trecho de código que só é executado quando nenhuma exceção ocorre: try: Código except Exceções: Código de tratamento da exceção else: Código executado se não ocorrem exceções
  • 17. Exemplo 6 >>> while True: try: a = input("Entre com um numero ") b = input("Entre com outro numero ") print a, "/", b, "=", a/b except Exception,e: print "Deu bode:",e print "Tente novamente" else: break Entre com um numero 1 Entre com outro numero xxx Deu bode: name 'xxx' is not defined Tente novamente Entre com um numero 1 Entre com outro numero 2 1 / 2 = 0
  • 18. A cláusula finally  A cláusula finally pode ser usada para se assegurar que mesmo que ocorra algum erro, uma determinada seqüência de comandos vai ser executada  Pode ser usada para restabelecer alguma variável para um valor default, por exemplo  Até a versão 2.4 do python, as cláusula finally e except eram mutuamente exclusivas  Exceções nesse caso não eram tratadas  Era possível combinar ambas usando comandos try aninhados
  • 19. Exemplo 7 (Python 2.5) >>> try: ... x = input("Entre com um número") ... except: ... print "Deu Bode" ... finally: ... print "restabelecendo um valor para x" ... x = None ... Entre com um número 1xx Deu Bode restabelecendo um valor para x
  • 20. Exemplo 7 (Python 2.4) >>> try: ... try: ... x = input("Entre com um número") ... finally: ... print "restabelecendo um valor para x" ... x = None ... except: ... print "Deu Bode" ... Entre com um número 1xx restabelecendo um valor para x Deu Bode
  • 21. Iteradores  São maneiras genéricas de implementar iterações com classes  Permite o uso do comando for  É muitas vezes mais econômico do que usar uma lista pois não é preciso armazenar todos os valores, mas apenas computar um por vez  Um iterador é uma classe que implementa o método mágico __iter__  É um método que, por sua vez, retorna um objeto que implementa um método chamado next  O método next deve retornar o “próximo” valor a ser iterado  Se não há próximo valor, next deve “levantar” a exceção StopIteration
  • 22. Exemplo >>> class MeuIterador: a = 0 def __iter__(self): return self def next(self): if self.a>10: raise StopIteration self.a += 1 return self.a >>> iter = MeuIterador() >>> for i in iter: print i, 1 2 3 4 5 6 7 8 9 10 11
  • 23. Geradores  Geradores são funções especiais que retornam iteradores  Em resumo, uma função geradora é uma que contém a o comando yield valor  Uma função geradora normalmente é chamada para obter o iterador para um comando for  O comando for automaticamente iterará sobre todos os valores que yield “retorna”  Observe que o iterador produzido pela função geradora é tal que o código que gera os valores e o código dentro do for se sucedem alternadamente  Geradores são especialmente úteis em códigos recursivos
  • 24. Exemplo >>> def gerador(): for i in range(10): print "i = ", i yield i >>> for j in gerador(): print "j = ",j i = 0 j = 0 i = 1 j = 1 .... i = 9 j = 9