Erros e Exceções

Em diversas situações, podem ocorrer erros ou exceções no Python. Veja alguns exemplos a seguir:


In [ ]:
print(4/0) # division by zero

In [ ]:
float("quatro ponto seis") # ValueError: could not convert string to float

Em alguns casos, o programador pode prever tais erros e evitá-los.

Entretanto, existem certos casos que é difícil ou até mesmo impossível prever se haverá um erro ou exceção.

Veja o exemplo abaixo:


In [ ]:
x = float(input("Digite um número:"))
print(1/x)

No caso anterior, caso o usuário digite o valor zero ou um texto não numérico (ex.: "aula"), ocasionará um erro. O programador não pode evitar tal situação.

Neste caso, é interessante fazer um tratamento de erros utilizando os comandos try e except.

Veja o exemplo anterior, mas com tratamento de erro:


In [40]:
try:
    x = float(input("Digite um número:"))
    print(1/x)
except ValueError:
    print ("Número inválido.")
except ZeroDivisionError:
    print ("O valor de x não pode ser zero.")
except:
    print ("Erro desconhecido.")
finally:
    print ("Fim do programa")


Digite um número:abc
Número inválido.
Fim do programa

No exemplo anterior, o código dentro do escopo try será executado.

Caso houver algum erro ou exceção no escopo do try, será tratado dentro dos respectivos escopos except:

  • except ValueError: será impresso "Número inválido.". Este erro ocorre quando o usuário digita algo não numérico.
  • except ZeroDivisionError: será impresso "O valor de x não pode ser zero.". Este erro ocorre quando o usuário digita "0".
  • except: se houver alguma outra exceção diferente das anteriores, será executado o código dentro deste escopo. Neste caso, será impresso "Erro desconhecido.".

O bloco finally é uma condição que sempre será executado, não importa se houve ou não erro ou exceção. Este bloco é opcional, mas muito útil em muitos casos.

Em alguns casos, o programador pode querer forçar uma exceção.

Nesta hipóstese, ao chamar o comando raise, será enviada uma exceção.

Veja o exemplo a seguir:


In [41]:
senha = input("Digite a senha de acesso: ")
try:
    if senha != "123":
        raise
    print("Senha correta!")
except:
    print("Senha incorreta!")


Digite a senha de acesso: 123
Senha correta!

No exemplo anterior, caso o usuário digite a senha incorreta (no exemplo, "123"), ocorrerá uma exeção.

Também é possível especificar o tipo de exceção. Veja o mesmo exemplo anterior, só que mais elaborado:


In [42]:
try:
    try:
        senha = int(input("Digite a senha de acesso: "))
    except ValueError:
        raise Exception('Senha não numérica.')
    if senha != 123:
        raise Exception("Senha incorreta.")
except Exception as e:
    print(e)


Digite a senha de acesso: 234
Senha incorreta.

No exemplo anterior, não apenas foi exemplificado a possibilidade de utilizarmos dois try aninhados (um dentro do outro), mas também que podemos inserir descrições sobre uma exceção gerada pelo comando raise.

Aprenda mais sobre exceções em Exceções em Python.