Python: Exceções, Iteradores e Geradores

Slides:



Advertisements
Apresentações semelhantes
Python: Entrada e Saída
Advertisements

Python: Funções Claudio Esperança.
Python: Recursão Claudio Esperança.
Python: Listas Claudio Esperança.
Python: Dicionários Claudio Esperança.
Python: Classes Claudio Esperança.
Programação em Java Prof. Maurício Braga
Python: Variáveis, I/O e IF
Estruturas de Controle
Programação em Java Prof. Maurício Braga
Parte I Capítulo 5 Reutilizando código e escrevendo funções.
Tratamento de Exceções
Excepções Algoritmos e Tipos Abstractos de Informação (ATAI)
(C) 2010 Pearson Education, Inc. Todos os direitos reservados. Os programas que obtêm certos tipos de recursos devem retorná-los ao sistema explicitamente.
Introdução à Computação - Jorge Macêdo
Exceptions em Java Leonardo Freitas e
Claudio Esperança Python: Comandos Básicos. Primeiros passos em programação Até agora só vimos como computar algumas expressões simples Expressões são.
OBS: Este ppt não é o definitivo (Versão Beta)
9 Controle de fluxo Seqüenciadores. Jumps. Escapes. Exceções.
Introdução ao -calculus
7 Abstração Genérica Unidades genéricas e instanciação.
Instrutor: Nilo Menezes
LINGUAGEM C Centro Federal de Educação Tecnológica da Paraíba Coordenação de Informática Professor: Lafayette B. Melo.
Apresentação da linguagem Python
Contratos Modelagem Funcional.
Estrutura de Dados em Java
P YTHON : T IPO L ISTA George Gomes Cabral. L ISTAS São arranjos seqüenciais de informações mais simples Caracterizam-se por permitir o acesso eficiente.
Introdução a linguagem Python
Bruno Rafael de Oliveira Rodrigues. Tratadores de Excessões A exceção é uma indicação de que um erro ou problema aconteceu durante a execução de uma aplicação.
Unidade I: “Dê um mergulho rápido”
Python: Módulos Claudio Esperança.
OO-SC (Meyer) - Cap 121 OO-SC (MEYER) Quando o contrato é quebrado: tratamento de exceções.
Prof. Natalia Castro Fernandes Engenharia de Telecomunicações – UFF 2º semestre/2012.
Conceitos básicos de orientação a objetos
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Linguagem de Programação II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Tecnologia para Web Tratamento de Exceções
Entrada e saída.
Estruturas de Dados Módulo 3 – Controle de Fluxo
How to Break Software Capítulo 3 Taíse Dias Testing from the user Interface.
How to Break Software Capítulo 2 Taíse Dias Testing from the User Interface.
Programação Orientada à Objetos
Rodrigo de Toledo (adaptação do original do prof. Claudio Esperança)
Procedimentos Pré-definidos em prolog comunicação
Prof. Roberto Rosa Aula 8.  A partir de agora vamos aprender como ver qual é o erro que está acontecendo em nosso projeto. Para.
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Linguagem II Exceções.
Paradigmas da Programação – Semestre 1 – Aula 10 Professor: Eduardo Mantovani )
Listas Simplesmente Encadeadas
Tratamento de Exceções
Capítulo 6 Exceções.
Coleções, Genéricos, Threads Marco Antonio. Collection Principais métodos da interface Collection.
Exceções Suzana Fragoso (smpf) Adaptado do material de Guilherme Carvalho (gvc)
Exceções Profa. Patrícia A. Jaques Alterada por Leandro Tonietto abr-15.
Estruturas de Dados I Segundo Período de 2008 Gabarito da Primeira Prova.
Java Conexão com Baco de dados Saulo Bazzi Oberderfer Fonte:
Recursividade Profs. De Prog2 e Lab2.
Paulo Borba Centro de Informática Universidade Federal de Pernambuco Exceções.
BCC221 Programação Orientada a Objetos Prof. Marco Antonio M. Carvalho 2014/2.
Orientação a Objetos e Java Graduação em Ciência da Computação  Centro de Informática, UFPE Alexandre Mota
Programação para Web I AULA 4 ESTRUTURAS DE CONTROLE.
UCSal – Bacharelado em Informática Tópicos Especiais em Informática II Profa. Semíramis Assis
Linguagem de Programação 11 Estruturas de Decisão e Repetição. Prof. Luiz José Hoffmann Filho
Capítulo 15 – Tratamento de Exceções
Tratamento de Exceções. Roteiro O que são exceções? Quando usar Capturando Exceções Exemplos.
Variáveis, expressões e comandos Dilvan Moreira. Lembrando …  Instalação normal (para utilizar no PC com Windows) 
Laboratório de Computação Aula 06 e 07 – Implementação de classes Prof. Fábio Dias
IF E ITERAÇÃO WHILE Dilvan Moreira (baseado no livro Big Java e T. Munzner)
Python: Exceções, Iteradores e Geradores
Python: Exceções, Iteradores e Geradores
Transcrição da apresentação:

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" File "<pyshell#5>", line 1, in -toplevel- raise Exception,"Deu bode" Exception: Deu bode >>> raise Exception("Deu Bode")‏ 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: except ZeroDivisionError: 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: print a, "/", b, "=", a/b 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: print a, "/", b, "=", a/b 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 duas 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 quisermos 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: except ZeroDivisionError: 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- 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 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 A cláusula finally e cláusulas except são mutuamente exclusivas Exceções nesse caso não são tratadas É possível combinar ambas usando comandos try aninhados, mas normalmente não há muito uso para isso

Exemplo 7 >>> try: except: Entre com um número 2xx 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 2xx 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 É geralmente 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 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 j in 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