Como Verificar se uma Exceção Específica foi Levantada em Python

PythonBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se uma exceção específica foi levantada em Python. O laboratório se concentra em entender diferentes tipos de exceções e como lidar com elas de forma eficaz.

Você explorará tipos de exceções comuns como TypeError, NameError, IndexError, KeyError, ValueError e FileNotFoundError através de exemplos práticos em um script Python. O laboratório o guiará na criação de um arquivo exceptions_demo.py e na adição de código que demonstra como cada tipo de exceção é levantado e capturado usando blocos try...except.

Aprenda sobre Tipos de Exceções

Nesta etapa, você aprenderá sobre diferentes tipos de exceções em Python. Exceções são eventos que interrompem o fluxo normal da execução de um programa. Entender os tipos de exceções é crucial para lidar com erros de forma eficaz.

Python possui muitas exceções embutidas, e você também pode criar as suas próprias. Aqui estão alguns tipos de exceções comuns:

  • TypeError: Levantada quando uma operação ou função é aplicada a um objeto de tipo inadequado.
  • NameError: Levantada quando um nome não é encontrado no namespace local ou global.
  • IndexError: Levantada quando um subscrito de sequência está fora do intervalo.
  • KeyError: Levantada quando uma chave de dicionário não é encontrada.
  • ValueError: Levantada quando uma operação ou função recebe um argumento que tem o tipo correto, mas um valor inadequado.
  • FileNotFoundError: Levantada quando um arquivo ou diretório é solicitado, mas não pode ser encontrado.

Vamos explorar esses tipos de exceções com alguns exemplos. Criaremos um script Python chamado exceptions_demo.py no diretório ~/project usando o editor VS Code.

  1. Abra o VS Code.
  2. Crie um novo arquivo chamado exceptions_demo.py no diretório ~/project.
  3. Adicione o seguinte código ao arquivo exceptions_demo.py:
## TypeError
try:
    result = 1 + "a"
except TypeError as e:
    print(f"TypeError: {e}")

## NameError
try:
    print(undefined_variable)
except NameError as e:
    print(f"NameError: {e}")

## IndexError
try:
    my_list = [1, 2, 3]
    print(my_list[5])
except IndexError as e:
    print(f"IndexError: {e}")

## KeyError
try:
    my_dict = {"a": 1, "b": 2}
    print(my_dict["c"])
except KeyError as e:
    print(f"KeyError: {e}")

## ValueError
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError: {e}")

## FileNotFoundError
try:
    with open("nonexistent_file.txt", "r") as f:
        content = f.read()
except FileNotFoundError as e:
    print(f"FileNotFoundError: {e}")

Este script demonstra como diferentes tipos de exceções são levantados e capturados usando blocos try...except. Cada bloco try contém código que pode levantar uma exceção específica. Se a exceção ocorrer, o bloco except correspondente é executado.

Agora, vamos executar o script:

  1. Abra o terminal no VS Code.
  2. Navegue até o diretório ~/project:
cd ~/project
  1. Execute o script exceptions_demo.py usando o comando python:
python exceptions_demo.py

Você deve ver a seguinte saída:

TypeError: unsupported operand type(s) for +: 'int' and 'str'
NameError: name 'undefined_variable' is not defined
IndexError: list index out of range
KeyError: 'c'
ValueError: invalid literal for int() with base 10: 'abc'
FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent_file.txt'

Esta saída mostra que cada bloco try levantou a exceção esperada, e o bloco except correspondente capturou e imprimiu a mensagem da exceção.

Entender diferentes tipos de exceções e como lidar com elas é essencial para escrever código Python robusto e confiável. Na próxima etapa, você aprenderá como capturar exceções específicas e lidar com elas apropriadamente.

Capturar uma Exceção Específica

Na etapa anterior, você aprendeu sobre diferentes tipos de exceções em Python. Agora, você aprenderá como capturar uma exceção específica usando o bloco try...except. Isso permite que você lide com diferentes erros de maneiras diferentes, tornando seu código mais robusto.

Ao capturar exceções, é uma boa prática ser o mais específico possível. Isso impede que seu bloco except capture acidentalmente exceções que não foram projetadas para lidar, o que pode mascarar erros e dificultar a depuração.

Vamos modificar o script exceptions_demo.py para capturar uma exceção específica, como ValueError, ao tentar converter uma string em um inteiro.

  1. Abra o arquivo exceptions_demo.py no diretório ~/project usando o VS Code.
  2. Modifique o script para capturar apenas o ValueError ao converter uma string em um inteiro:
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

Neste exemplo, capturamos especificamente o ValueError que ocorre quando int("abc") falha. Se qualquer outra exceção ocorrer dentro do bloco try, ela será capturada pelo bloco except Exception as e:. A instrução print("Continuing execution...") sempre será executada se alguma exceção for capturada, demonstrando que o programa continua a ser executado após o tratamento da exceção.

Agora, vamos executar o script:

  1. Abra o terminal no VS Code.
  2. Navegue até o diretório ~/project:
cd ~/project
  1. Execute o script exceptions_demo.py usando o comando python:
python exceptions_demo.py

Você deve ver a seguinte saída:

ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

Esta saída mostra que o ValueError foi capturado e o programa continuou a ser executado.

Agora, vamos modificar o script para levantar uma exceção diferente, como TypeError, e ver como ela é tratada:

  1. Abra o arquivo exceptions_demo.py no diretório ~/project usando o VS Code.
  2. Modifique o script para levantar um TypeError:
try:
    result = 1 + "a"
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

Agora, execute o script novamente:

python exceptions_demo.py

Você deve ver a seguinte saída:

Some other exception: unsupported operand type(s) for +: 'int' and 'str'
Continuing execution...

Esta saída mostra que o TypeError foi capturado pelo bloco except Exception as e:, porque não há um bloco except TypeError específico.

Capturar exceções específicas permite que você lide com diferentes erros de maneiras diferentes, tornando seu código mais robusto e fácil de depurar. Na próxima etapa, você aprenderá como verificar a instância da exceção.

Verificar a Instância da Exceção

Nesta etapa, você aprenderá como verificar a instância da exceção para obter mais informações sobre o erro que ocorreu. Quando você captura uma exceção, pode acessar o próprio objeto de exceção, que contém detalhes sobre o erro.

Vamos modificar o script exceptions_demo.py para imprimir o tipo e os argumentos da instância da exceção.

  1. Abra o arquivo exceptions_demo.py no diretório ~/project usando o VS Code.
  2. Modifique o script para imprimir o tipo e os argumentos da exceção ValueError:
try:
    num = int("abc")
except ValueError as e:
    print(f"Exception type: {type(e)}")
    print(f"Exception arguments: {e.args}")
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

Neste exemplo, imprimimos o tipo do objeto de exceção usando type(e) e os argumentos da exceção usando e.args. O atributo e.args é uma tupla contendo os argumentos que foram passados para o construtor da exceção.

Agora, vamos executar o script:

  1. Abra o terminal no VS Code.
  2. Navegue até o diretório ~/project:
cd ~/project
  1. Execute o script exceptions_demo.py usando o comando python:
python exceptions_demo.py

Você deve ver a seguinte saída:

Exception type: <class 'ValueError'>
Exception arguments: ("invalid literal for int() with base 10: 'abc'",)
ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

Esta saída mostra o tipo da exceção (ValueError) e os argumentos passados para o construtor da exceção (uma tupla contendo a mensagem de erro).

Você pode usar essas informações para fornecer mensagens de erro mais detalhadas ou tomar ações específicas com base no tipo e nos argumentos da exceção.

Por exemplo, você pode verificar se os argumentos da exceção contêm uma mensagem de erro específica:

try:
    num = int("abc")
except ValueError as e:
    if "invalid literal" in e.args[0]:
        print("Invalid input: Please enter a valid number.")
    else:
        print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

Neste exemplo, verificamos se o primeiro argumento da exceção ValueError contém a string "invalid literal". Se contiver, imprimimos uma mensagem de erro mais específica.

Verificar a instância da exceção permite que você lide com erros de forma mais inteligente e forneça mensagens de erro mais informativas ao usuário.

Resumo

Neste laboratório, a primeira etapa se concentra em entender diferentes tipos de exceções em Python, que são cruciais para o tratamento eficaz de erros. O laboratório apresenta exceções embutidas comuns, como TypeError, NameError, IndexError, KeyError, ValueError e FileNotFoundError.

O laboratório então fornece exemplos práticos de como essas exceções são levantadas e capturadas usando blocos try...except. Um script Python chamado exceptions_demo.py é criado para demonstrar cada tipo de exceção, mostrando como antecipar e lidar com possíveis erros que podem interromper o fluxo normal da execução de um programa.