O básico sobre tratamento de exceções

Erros detectados durante a execução são chamados de exceções e não são necessariamente fatais. A maioria das exceções não são lidadas pelos programas, entretanto, um resultado de mensagens de erros são ilustradas abaixo:


In [1]:
10 *(1/0)


---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-1-8a63a1710ca5> in <module>()
----> 1 10 *(1/0)

ZeroDivisionError: division by zero

In [2]:
4 + spam*3


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-6b1dfe582d2e> in <module>()
----> 1 4 + spam*3

NameError: name 'spam' is not defined

In [3]:
'2' + 2


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-4c6dd5170204> in <module>()
----> 1 '2' + 2

TypeError: Can't convert 'int' object to str implicitly

Podemos controlar o fluxo de execução quando algo inesperado ocorrer em nosso código.


In [4]:
produtos = ["ipda", "cel", "note"]
print(produtos[1])


cel

In [5]:
print(produtos[3])


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-5-5bbd06ac9260> in <module>()
----> 1 print(produtos[3])

IndexError: list index out of range

Para contornar esse erro, podemos utilizar o par try/catch.


In [6]:
try:
    print(produtos[3])
except:
    print("O vetor não possui a posição desejada")


O vetor não possui a posição desejada

Desta forma o erro não aparece, porém caso o erro seja de outro tipo, como:


In [7]:
produtos[3+'1']


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-8577fa4d78b9> in <module>()
----> 1 produtos[3+'1']

TypeError: unsupported operand type(s) for +: 'int' and 'str'

In [8]:
try:
    print(produtos[3+'1'])
except:
    print("O vetor não possui a posição desejada")


O vetor não possui a posição desejada

Note que a saída será a mesma que definimos anteriormente. Portanto precisamos expecificar qual é o tipo no except.


In [9]:
try:
    print(produtos[3+'1'])
except IndexError:
    print("O vetor não possui a posição desejada")


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-39f91b937eb4> in <module>()
      1 try:
----> 2     print(produtos[3+'1'])
      3 except IndexError:
      4     print("O vetor não possui a posição desejada")

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Para ter mais de uma except, é só adicionar o outro tipo abaixo:


In [10]:
try:
    print(produtos[3+'1'])
except IndexError:
    print("O vetor não possui a posição desejada")
except TypeError:
    print("Erro de Tipo")


Erro de Tipo

Alguns tipos existentes de Erro estão listados na tabela abaixo

Classe Descrição
Exception Base classe para a maioria dos tipos de erros.
AttributeError Aparece quando um objeto não tem o membro desejado. Por exemplo, objeto.teste, se teste não existir, aparece essa exceção.
EOFError Aparece quando um final de arquivo é alcançado pelo console ou pelo arquivo.
IOError Aparece quando ocorre alguma operação de erro de I/O (por exemplo, abrir um arquivo).
IndexError Aparece se o index de um sequencia está for a dos limites.
KeyError Aparece se uma chave não existente é requisitada para um dicionário ou set.
KeyboardInterrupt Aparece se o usuário digitar Ctrl-C enquanto o programa está executando
NameError Aparece se um identificador não existente é utilizado
TypeError Aparece quando um tipo errado do parâmetro é enviado para a função
ValueError Aparece quando um parâmetro tem valor invalido, por exemplo, sqtr(-5)
ZeroDivisionError Aparece quando qualquer divisão utiliza 0 como divisor

Mais sobre tratamento de exceções em: https://docs.python.org/3/tutorial/errors.html

Exceções no Tweepy

As exceções estão disponíveis no módulo tweepy diretamente, o que significa que não é necessário importar tweepy.error. Por exemplo, tweepy.error.TweepError está disponível por tweepy.TweepError.

  • exception TweepError - Erro comumente utilizado, ele aparece por diversos motivos. O código do erro pode ser acessado por TweepError.message[0]['code']. Os códigos estão descritos na página de códigos de erros da API do Twitter.
  • exception RateLimitError - Erro acontece quando o Twitter aplica algum limite, facilitando o tratamento do mesmo.

Referência: http://tweepy2.readthedocs.io/en/latest/api.html?highlight=tweepy.TweepError#tweepy-error-exceptions

Exemplo de código:

try:
    novos_tweets = api.search(q='Python')

except tweepy.TweepError as e:
    print("Erro:", (e))

Abra o notebook aula4-parte4-pesquisar-tweets.ipynb e altere uma das chaves de acesso para fazer o teste. Note que quando executar o while, a seguinte saída irá aparecer:

Erro: [{'code': 32, 'message': 'Could not authenticate you.'}]

In [ ]: