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