About
Swaroop C H is 27 years of age. He graduated in B.E. (Computer Science) from PESIT, Bangalore, India. He has previously worked at Yahoo! and Adobe.
Page
Support
Personal tools
COLLECTION
Collection
Python pt-br:Excecoes
From Notes
Contents |
[edit] Introdução
Exceções ocorrem quando determinadas situações "excepcionais" ocorrem em seu programa. Por exemplo, que tal se você estiver para ler um arquivo e este não existir? Ou que tal se você acidentalmente deletou-o durante a execução do programa? Tais situações são manipuladas uitizando exceções.
De modo análogo, que tal se o seu programa tivesse comandos inválidos? Isso é manipulado por Python, que levanta (raise) as mãos e avisa a você que existe um erro.
[edit] Erros
Suponha uma simples chamada da função print<tt>. Que tal se nós escrevêssemos errado como <tt>print ou Print<tt>? Observe a capitalização. Neste caso, Python levanta um erro de sintaxe.
>>> Print('Hello World')
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
Print('Hello World')
NameError: name 'Print' is not defined
>>> print('Hello World')
Hello World
Observe que um <tt>NameError é levantado e também que a localização onde o erro foi detetado é impressa. Isso é o que um error handler para este erro faz.
[edit] Exceções
Nós tentaremos (try) ler a entrada do usuário. Digite ctrl-d e veja o que acontece.
>>> s = input('Entre com alguma coisa --> ')
Entre com alguma coisa -->
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
s = input('Entre com alguma coisa --> ')
EOFError: EOF when reading a line
Python levanta um erro chamado EOFError o qual basicamente significa que encontrou um símbolo end of file (fim do arquivo) (representado por ctrl-d) quando não esperaria vê-lo.
[edit] Manipulando Exceções
Nós podemos manipular exceções usando o comando try..except. Nós basicamente colocamos os comandos costumeiros dentro do bloco do try e dipomos os nossos manipuladores de erros no bloco do except.
#!/usr/bin/python # Nome do arquivo: try_except.py try: texto = input('Entre com alguma coisa --> ') except EOFError: print('Por que você jogou um EOF em mim?') except KeyboardInterrupt: print('Você cancelou a operação.') else: print('Você entrou com {0}'.format(texto))
Saída:
$ python try_except.py Entre com alguma coisa --> # Press ctrl-d Por que você jogou um EOF em mim? $ python try_except.py Entre com alguma coisa --> # Press ctrl-c Você cancelou a operação. $ python try_except.py Enter something --> nenhuma exceção Você entrou com nenhuma exceção
Como Funciona:
Nós colocamos todos os comandos que poderiam levantar exceções dentro do bloco do try e então os 'handlers' para os erros/exceções na cláusula/bloco except. a cláusula except pode manipular um único erro ou exceção especificada, ou uma lista de erros/exceções entre parênteses. Se nenhum nome de erro ou exceção for fornecido, manipulará todos os erros ou exceções.
Note que deve haver pelo menos uma cláusula except associada com cada cláusula try. Ou não haveria razão para um bloco de try.
Se um erro ou exceção não é manipulada, então é invocado o Python handler padrão que interrompe a execução do programa e emite uma mensagem de erro. Nós vimos isso em ação acima.
Nós podemos também ter uma cláusula else associada a um bloco try..catch. A cláusula else é executada se nenhuma exceção ocorrer.
No pŕoximo exemplo, nós veremos como obter um objeto exceção de modo que nós possamos recuperar informação adicional.
[edit] Levantando Exceções
Você pode levantar exceções com o comando raise fornecendo o nome do erro/exceção e o objeto exceção que deverá ser lançado (thrown).
O erro ou exceção que você pode levantar deverá ser uma classe que direta ou indiretamente deve ser uma classe derivada da classe Exception.
#!/usr/bin/python # Nome do arquivo: raising.py class ShortInputException(Exception): '''Uma classe exceção definida pelo usuário.''' def __init__(self, length, atleast): Exception.__init__(self) self.length = length self.atleast = atleast try: text = input('Entre com alguma coisa --> ') if len(text) < 3: raise ShortInputException(len(text), 3) # Demais tarefas podem continuar como usualmente aqui... except EOFError: print('Por que você jogou um EOF em mim?') except ShortInputException as ex: print('ShortInputException: A entrada teve o comprimento {0}, o esperado era pelo menos {1}'\ .format(ex.length, ex.atleast)) else: print('Nenhuma exceção foi levantada.')
Saída:
$ python raising.py Entre com alguma coisa --> a ShortInputException: A entrada teve o comprimento 1, o esperado era pelo menos 3 $ python raising.py Enter something --> abc Nenhuma exceção foi levantada.
Como Funciona:
Aqui nós estamos criando o nosso próprio tipo de Exceção. Este novo tipo de exceção é chamado ShortInputException. Ele tem dois campos - length que é o comprimento da entrada fornecida e atleast que é o mínimo comprimento da entrada que o programa estava esperando.
Na cláusula except, nós mencionamos a classe de erro que será guardada as (como) o nome da variable que irá manter o objeto erro/exceção correspondente. Isto é análogo aos parâmetros e argumentos em uma chamada de função. Dentro dessa particular cláusula except clause, nós usamos os campos length e atleast do objeto exceção para imprimir uma mensagem apropriada ao usuário.
[edit] Try .. Finally
Suponha que você estivesse lendo um arquivo em seu programa. Como você poderia assegurar-se que o objeto arquivo estivesse fechado adequadamente, fosse ou não levantada uma exceção? Isso pode ser obtido usando-se o bloco finally. Note que você pode empregar uma cláusula except juntamente com o bloco finally para o mesmo correspondente bloco try. Você terá que imergir um dentro do outro se quiser utilizar ambos.
#!/usr/bin/python # Nome do arquivo: finally.py import time try: f = open('poema.txt') while True: # nossa usual linguagem de leitura de arquivo line = f.readline() if len(line) == 0: break print(line, end='') time.sleep(2) # Assegurar que levará algum tempo executando except KeyboardInterrupt: print('!! Você cancelou a leitura do arquivo.') finally: f.close() print('(Limpando tudo: Fechado o arquivo)')
Saída:
$ python finally.py Programming is fun When the work is done if you wanna make your work also fun: !! Você cancelou a leitura do arquivo. (Limpando tudo: Fechado o arquivo)
Como Funciona:
Nós efetuamos a tradicional rotina de leitura do arquivo, mas introduzimos arbitrariamente uma pausa ('sleeping') de 2 segundos depois da impressão de cada linha, usando a função time.sleep de modo que o programa execute lentamente (Python é muito rápido por natureza). Enquanto o programa estiver executando, digite ctrl-c para interromper/cancelar o programa.
Observe que a exceção KeyboardInterrupt é lançada e o programa termina. Entretanto, antes da saída do programa, a cláusula finally é executada e o objeto arquivo é sempre fechado.
[edit] O Comando With
Adquirir um recurso no bloco try e liberá-lo no bloco finally é um padrão comum. Daí existe também o comando with que faz com que isso seja realizado de um modo bem mais claro:
#!/usr/bin/python # Nome do arquivo: using_with.py with opened("poema.txt") as f: for line in f: print(line, end='')
Como Funciona:
A saída deverá ser a mesma do exemplo anterior. A diferença aqui está em que nós estamos usando a função opened com o comando with.
Isto não congestiona o processamento do arquivo e focaliza no que estamos fazendo com ele. Nós deixamos o fechamento do arquivo a ser realizado automaticamente por opened.
[edit] Resumo
Nós discutimos o uso dos comandos try..except e try..finally. Vimos como criar o nosso próprio tipo de exceção e também como levantar exceções.
Em seguida, exploraremos a Python Standard Library (Bibioteca Padrão do Python).
Please add your comments by clicking on the 'Discussion' link in the left sidebar.