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")
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!")
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)
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.