Neste tutorial, você aprenderá como lidar com exceções em seu programa Python usando as instruções try, except e finally com a ajuda de exemplos.
Vídeo: Manipulação de exceções Python (tente … exceto … finalmente)
Exceções em Python
Python tem muitas exceções embutidas que são levantadas quando seu programa encontra um erro (algo dá errado no programa).
Quando essas exceções ocorrem, o interpretador Python para o processo atual e o passa para o processo de chamada até que seja tratado. Se não for tratado, o programa irá travar.
Por exemplo, vamos considerar um programa em que temos uma função A
que chama function B
, que por sua vez chama function C
. Se ocorrer uma exceção na função, C
mas não for tratada C
, a exceção passa para B
e depois para A
.
Se nunca for tratado, uma mensagem de erro será exibida e nosso programa será interrompido repentinamente.
Captura de exceções em Python
Em Python, as exceções podem ser tratadas por meio de uma try
instrução.
A operação crítica que pode gerar uma exceção é colocada dentro da try
cláusula. O código que trata as exceções está escrito na except
cláusula.
Podemos, portanto, escolher quais operações executar depois de detectar a exceção. Aqui está um exemplo simples.
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()(0), "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Resultado
A entrada é um Ops! ocorreu. Próxima entrada. A entrada é 0 Ops! ocorreu. Próxima entrada. A entrada é 2 O recíproco de 2 é 0,5
Neste programa, percorremos os valores da lista randomList. Conforme mencionado anteriormente, a parte que pode causar uma exceção é colocada dentro do try
bloco.
Se nenhuma exceção ocorrer, o except
bloco é ignorado e o fluxo normal continua (para o último valor). Mas se ocorrer alguma exceção, ela será capturada pelo except
bloco (primeiro e segundo valores).
Aqui, imprimimos o nome da exceção usando a exc_info()
função dentro do sys
módulo. Podemos ver isso a
causas ValueError
e 0
causas ZeroDivisionError
.
Uma vez que cada exceção em Python herda da Exception
classe base , também podemos realizar a tarefa acima da seguinte maneira:
# import module sys to get the type of exception import sys randomList = ('a', 0, 2) for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Este programa tem a mesma saída do programa acima.
Captura de exceções específicas em Python
No exemplo acima, não mencionamos nenhuma exceção específica na except
cláusula.
Esta não é uma boa prática de programação, pois captura todas as exceções e trata todos os casos da mesma maneira. Podemos especificar quais exceções uma except
cláusula deve capturar.
Uma try
cláusula pode ter qualquer número de except
cláusulas para lidar com diferentes exceções, no entanto, apenas uma será executada no caso de ocorrer uma exceção.
Podemos usar uma tupla de valores para especificar várias exceções em uma cláusula except. Aqui está um exemplo de pseudocódigo.
try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass
Levantando exceções em Python
Na programação Python, exceções são levantadas quando ocorrem erros no tempo de execução. Também podemos levantar exceções manualmente usando a raise
palavra - chave.
Podemos opcionalmente passar valores para a exceção para esclarecer porque essa exceção foi levantada.
>>> raise KeyboardInterrupt Traceback (most recent call last):… KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last):… MemoryError: This is an argument >>> try:… a = int(input("Enter a positive integer: "))… if a <= 0:… raise ValueError("That is not a positive number!")… except ValueError as ve:… print(ve)… Enter a positive integer: -2 That is not a positive number!
Python try with else clause
Em algumas situações, você pode querer executar um determinado bloco de código se o bloco de código interno foi try
executado sem erros. Para esses casos, você pode usar a else
palavra-chave opcional com a try
instrução.
Observação : as exceções na cláusula else não são tratadas pelas cláusulas except anteriores.
Vejamos um exemplo:
# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)
Resultado
Se passarmos um número ímpar:
Digite um número: 1 Não é um número par!
Se passarmos um número par, o recíproco é calculado e exibido.
Digite um número: 4 0,25
No entanto, se passarmos 0, obteremos ZeroDivisionError
como o bloco de código interno else
não é tratado pelo precedente except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()
Este tipo de construção garante que o arquivo seja fechado mesmo se ocorrer uma exceção durante a execução do programa.