POO
Exceções
Exceções
- Quando um programa encontra dificuldades não previstas, é dito que ocorreu uma condição excepcional ou uma exceção
- Um erro é uma exceção, mas nem toda exceção é necessariamente um erro
- Python define os objetos de exceção para poder representar tais eventos
- 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 é a instância da classe ZeroDivisionError
- Diz-se que o programa gerou ou disparou (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 lançamento de um objeto de exceção, mas apenas são exibidas sob a forma de um aviso.
- Exemplo:
- Neste caso, o interpretador sinaliza que o módulo regex está ultrapassado e foi substituído por outro mais atualizado chamado re.
- O programa não falha, mas o programador fica ciente de que provavelmente deverá reescrever o seu código
>>> import regex
Warning (from warnings module):
File "__main__", line 1
DeprecationWarning: the regex module is deprecated; please use the re module.
O comando raise
- Para sinalizar a ocorrênciua de uma condição excepcional, pode-se usar o comando raise, que pode ser utilizado da seguinte maneira:
- raise classe
- raise classe,mensagem
- raise classe(mensagem)
- Onde classe é uma das classes de exceção definidas pelo Python ou definidas no programa
- 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', ...]
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-
rise 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
Criando uma Classe de Exceção
- Basta criar uma classe de forma habitual, herdando da classe Exception
- Não é preciso redefinir qualquer método
- Exemplo:
>>> 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 lançada 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 e var é uma variável atribuída a um objeto exceção
Exemplos
try:
a = input("Entre com um numero ")
b = input("Entre com outro numero ")
print(a,"/",b,"=",a/b)
except ZeroDivisionError:
print("Ooops, o divisor não pode ser zero!")
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!")
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)
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 o nome da classe
- Outra opção é usar a classe Exception, que é a base para todas as exceções e portanto contempla qualquer exceção
- Se não quisermos tratar um erro em uma cláusula except, podemos passá-lo adiante usando o comando raise
- Neste caso, podemos usar um raise sem argumentos ou passar explicitamente um objeto de exceção
Exemplos
try:
a = input("Entre com um numero ")
b = input("Entre com outro numero ")
print(a,"/",b,"=",a/b)
except ZeroDivisionError:
print("Ooops, o divisor não pode ser zero!")
except TypeError:
print("Ooops, você não digitou um número")
except:
print("Deu um bode qualquer"
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
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:
Código de tratamento da exceção
else:
Código executado se não ocorrem exceções
Exemplo
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
Poo-Exceções
By diegoep
Poo-Exceções
- 462