Manipulação de exceções do Python usando a instrução try, except e finally

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 Aque chama function B, que por sua vez chama function C. Se ocorrer uma exceção na função, Cmas não for tratada C, a exceção passa para Be 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 tryinstrução.

A operação crítica que pode gerar uma exceção é colocada dentro da trycláusula. O código que trata as exceções está escrito na exceptclá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 trybloco.

Se nenhuma exceção ocorrer, o exceptbloco é ignorado e o fluxo normal continua (para o último valor). Mas se ocorrer alguma exceção, ela será capturada pelo exceptbloco (primeiro e segundo valores).

Aqui, imprimimos o nome da exceção usando a exc_info()função dentro do sysmódulo. Podemos ver isso acausas ValueErrore 0causas ZeroDivisionError.

Uma vez que cada exceção em Python herda da Exceptionclasse 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 exceptclá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 exceptcláusula deve capturar.

Uma trycláusula pode ter qualquer número de exceptclá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 raisepalavra - 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 tryexecutado sem erros. Para esses casos, você pode usar a elsepalavra-chave opcional com a tryinstruçã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 ZeroDivisionErrorcomo o bloco de código interno elsenã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.

Artigos interessantes...