Tratamento de Exceções em Python

Tratamento de Exceções

Em computação e programação de computadores, o tratamento de exceções é o processo de responder à ocorrência de exceções – condições anômalas ou excepcionais que requerem processamento especial.

Python tem muitas exceções embutidas que são levantadas quando um programa encontra um erro, e a maioria das bibliotecas externas, como a popular Requests, inclui suas próprias exceções personalizadas com as quais precisaremos lidar.

Tratamento básico de exceções

Você não pode dividir por zero, isso é uma verdade matemática, e se você tentar fazer isso em Python, o interpretador levantará a exceção embutida ZeroDivisionError:

def divide(dividend , divisor):
    print(dividend / divisor)

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

Digamos que não queremos que nosso programa pare sua execução ou mostre ao usuário uma saída que ele não entenderá. Se quisermos imprimir uma mensagem útil e clara, então precisamos tratar a exceção com as palavras-chave try e except:

# try-except: trata exceções graciosamente
def divide(dividend , divisor):
    try:  # Tenta executar este código
        print(dividend / divisor)
    except ZeroDivisionError:  # Captura o tipo de exceção específico
        print('Você não pode dividir por 0')

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
Você não pode dividir por 0
Quiz

Faça login para responder este quiz e acompanhar seu progresso de aprendizagem

Quais palavras-chave são usadas para tratar exceções em Python?
A. try e except
B. catch e handle
C. error e rescue
D. if e else

Tratamento de Múltiplas exceções usando um bloco de exceção

Você também pode tratar múltiplas exceções em uma única linha como a seguinte, sem a necessidade de criar múltiplos blocos de exceção.

# Trata múltiplas exceções em um único bloco except
def divide(dividend , divisor):
    try:
        if (dividend == 10):
          var = 'str' + 1  # Isso levantará TypeError
        else:
          print(dividend / divisor)
    except (ZeroDivisionError, TypeError) as error:  # Captura múltiplos tipos de exceção
        print(error)  # Imprime a mensagem de erro

divide(dividend=20, divisor=5)
4
divide(dividend=10, divisor=5)
can only concatenate str (not "int") to str
divide(dividend=10, divisor=0)
division by zero
Quiz

Faça login para responder este quiz e acompanhar seu progresso de aprendizagem

Você pode tratar múltiplos tipos de exceção em um único bloco except?
A. Não, você deve usar blocos except separados para cada tipo de exceção
B. Sim, colocando-os em uma tupla como except (Exception1, Exception2)
C. Sim, mas apenas se estiverem relacionados
D. Não, Python não suporta isso

Código Finally no tratamento de exceções

O código dentro da seção finally é sempre executado, independentemente de uma exceção ter sido levantada ou não:

# Bloco finally: sempre executa independentemente de exceções
def divide(dividend , divisor):
    try:
        print(dividend / divisor)
    except ZeroDivisionError:
        print('Você não pode dividir por 0')
    finally:  # Sempre executa, mesmo se a exceção ocorrer
        print('Execução finalizada')

divide(dividend=10, divisor=5)
2.0
Execução finalizada
divide(dividend=10, divisor=0)
Você não pode dividir por 0
Execução finalizada
Quiz

Faça login para responder este quiz e acompanhar seu progresso de aprendizagem

Quando o bloco finally é executado?
A. Apenas quando uma exceção ocorre
B. Apenas quando nenhuma exceção ocorre
C. Sempre, independentemente de uma exceção ter ocorrido ou não
D. Nunca

Exceções Personalizadas

Exceções personalizadas são inicializadas criando uma class que herda da classe base Exception do Python, e são levantadas usando a palavra-chave raise:

# Exceção personalizada: criada herdando da classe Exception
class MyCustomException(Exception):
    pass

raise MyCustomException  # Levanta a exceção personalizada
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException

Para declarar uma mensagem de exceção personalizada, você pode passá-la como um parâmetro:

class MyCustomException(Exception):
    pass

raise MyCustomException('Uma mensagem personalizada para minha exceção personalizada')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException: Uma mensagem personalizada para minha exceção personalizada

Tratar uma exceção personalizada é o mesmo que qualquer outra:

try:
    raise MyCustomException('Uma mensagem personalizada para minha exceção personalizada')
except MyCustomException:
    print('Minha exceção personalizada foi levantada')
Minha exceção personalizada foi levantada
Quiz

Faça login para responder este quiz e acompanhar seu progresso de aprendizagem

Como você cria uma exceção personalizada em Python?
A. Criando uma classe que herda da classe Exception
B. Usando o decorador @exception
C. Chamando Exception.create()
D. Importando-a de um módulo especial