Introdução
Neste laboratório, você aprenderá como explorar e acessar mensagens de exceção em Python para depurar e lidar com erros de forma eficaz. O laboratório guia você através da criação de um script Python com uma função divide que usa um bloco try...except para capturar potenciais exceções durante a divisão. Você observará como diferentes tipos de exceções, como ZeroDivisionError e TypeError, geram mensagens de erro específicas.
O laboratório demonstra então como acessar o objeto de exceção e seu tipo para obter informações mais detalhadas sobre o erro. Ao executar o script com diferentes entradas, você verá como as mensagens de exceção fornecem informações valiosas sobre a causa dos erros, permitindo que você identifique e corrija problemas em seu código.
Explorar Mensagens de Exceção
Nesta etapa, você aprenderá como explorar mensagens de exceção em Python. As mensagens de exceção fornecem informações valiosas sobre o que deu errado em seu código, ajudando você a depurar e corrigir erros.
Primeiro, vamos criar um arquivo Python chamado exceptions.py em seu diretório ~/project usando o editor VS Code.
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
print("An error occurred:", e)
divide(10, 2)
divide(10, 0)
divide("hello", 5)
Neste código:
- Definimos uma função
divide(x, y)que tenta dividirxpory. - Usamos um bloco
try...exceptpara capturar quaisquer exceções que possam ocorrer durante a divisão. - Se uma exceção ocorrer, imprimimos uma mensagem de erro junto com o objeto de exceção
e.
Agora, vamos executar o script exceptions.py usando o comando python:
python exceptions.py
Você deve ver a seguinte saída:
The result is: 5.0
An error occurred: division by zero
An error occurred: unsupported operand type(s) for /: 'str' and 'int'
Como você pode ver, a primeira chamada para divide(10, 2) é executada com sucesso e imprime o resultado. A segunda chamada, divide(10, 0), levanta uma exceção division by zero, que é capturada pelo bloco except, e a mensagem de erro correspondente é impressa. A terceira chamada, divide("hello", 5), levanta um TypeError porque você não pode dividir uma string por um inteiro.
Agora, vamos modificar o arquivo exceptions.py para imprimir o tipo da exceção:
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
print("An error occurred:", type(e), e)
divide(10, 2)
divide(10, 0)
divide("hello", 5)
Execute o script novamente:
python exceptions.py
Você deve ver a seguinte saída:
The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> division by zero
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'
Esta saída mostra o tipo de cada exceção que ocorreu, fornecendo ainda mais informações para depuração.
Acessar os Argumentos da Exceção
Nesta etapa, você aprenderá como acessar os argumentos (args) associados a uma exceção em Python. Os argumentos da exceção podem fornecer detalhes mais específicos sobre o erro que ocorreu.
Vamos modificar o arquivo exceptions.py que você criou na etapa anterior para acessar e imprimir os argumentos da exceção. Abra exceptions.py em seu diretório ~/project usando o editor VS Code.
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
print("An error occurred:", type(e), e.args)
divide(10, 2)
divide(10, 0)
divide("hello", 5)
Neste código, modificamos o bloco except para imprimir e.args. O atributo args é uma tupla contendo os argumentos que foram passados para o construtor da exceção.
Agora, execute o script exceptions.py:
python exceptions.py
Você deve ver a seguinte saída:
The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> ('division by zero',)
An error occurred: <class 'TypeError'> ("unsupported operand type(s) for /: 'str' and 'int'",)
Como você pode ver, a saída agora inclui os argumentos associados a cada exceção. Para ZeroDivisionError, o argumento é uma tupla contendo a string 'division by zero'. Para TypeError, o argumento é uma tupla contendo a string "unsupported operand type(s) for /: 'str' and 'int'" .
Vamos modificar o arquivo exceptions.py novamente para acessar o primeiro argumento diretamente:
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
print("An error occurred:", type(e), e.args[0])
divide(10, 2)
divide(10, 0)
divide("hello", 5)
Execute o script novamente:
python exceptions.py
Você deve ver a seguinte saída:
The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> division by zero
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'
Ao acessar e.args[0], podemos extrair o primeiro argumento da exceção, que geralmente é a parte mais descritiva da mensagem de erro.
Comparar a String da Mensagem
Nesta etapa, você aprenderá como corresponder a string da mensagem de uma exceção em Python. Isso é útil quando você deseja lidar com tipos específicos de exceções de forma diferente com base em sua mensagem.
Vamos modificar o arquivo exceptions.py com o qual você tem trabalhado para capturar o ZeroDivisionError especificamente e imprimir uma mensagem personalizada. Abra exceptions.py em seu diretório ~/project usando o editor VS Code.
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except ZeroDivisionError as e:
print("Cannot divide by zero!")
except Exception as e:
print("An error occurred:", type(e), e.args[0])
divide(10, 2)
divide(10, 0)
divide("hello", 5)
Neste código:
- Adicionamos um bloco
exceptespecífico paraZeroDivisionError. - Se um
ZeroDivisionErrorocorrer, imprimimos a mensagem "Cannot divide by zero!". - O bloco genérico
except Exception as ecapturará quaisquer outras exceções.
Agora, execute o script exceptions.py:
python exceptions.py
Você deve ver a seguinte saída:
The result is: 5.0
Cannot divide by zero!
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'
Como você pode ver, quando divide(10, 0) é chamado, o ZeroDivisionError é capturado pelo bloco except específico, e a mensagem personalizada "Cannot divide by zero!" é impressa. O TypeError levantado por divide("hello", 5) ainda é capturado pelo bloco except genérico.
Você também pode corresponder a string da mensagem diretamente, embora isso geralmente seja menos recomendado do que capturar tipos específicos de exceção. Veja como você pode fazer isso:
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
if "division by zero" in str(e):
print("Cannot divide by zero!")
else:
print("An error occurred:", type(e), e.args[0])
divide(10, 2)
divide(10, 0)
divide("hello", 5)
Neste código:
- Capturamos todas as exceções no bloco
exceptgenérico. - Verificamos se a string "division by zero" está presente na representação de string do objeto de exceção
e. - Se estiver, imprimimos "Cannot divide by zero!". Caso contrário, imprimimos a mensagem de erro genérica.
Execute o script novamente:
python exceptions.py
Você deve ver a mesma saída que antes:
The result is: 5.0
Cannot divide by zero!
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'
Embora corresponder a string da mensagem possa ser útil em alguns casos, geralmente é melhor capturar tipos específicos de exceção porque as mensagens de exceção podem mudar, tornando seu código menos confiável.
Resumo
Neste laboratório, você explorou as mensagens de exceção em Python para entender como depurar e corrigir erros. Você aprendeu a usar um bloco try...except para capturar exceções durante operações de divisão e imprimir o objeto de exceção e para visualizar a mensagem de erro.
Você também modificou o script para imprimir o tipo da exceção, obtendo mais informações sobre a natureza dos erros encontrados, como ZeroDivisionError e TypeError. Isso permite uma depuração e tratamento de erros mais direcionados.



