revisão de tratamento de erros
---
id: 67f39bcb48373420f4f12d62
title: revisão de tratamento de erros
challengeType: 31
dashedName: review-error-handling
---
# --description--
Erros comuns em Python
- SyntaxError: O erro que o Python gera quando seu código não segue suas regras de sintaxe. Por exemplo, o código
print("Hello there"levará a um erro de sintaxe com a mensagem,SyntaxError: '(' was never closed, porque o código está sem um parêntese de fechamento. - NameError: Python gera um
NameErrorquando você tenta acessar uma variável ou função que não definiu. Por exemplo, se você tiver a linhaprint(username)no seu código sem ter uma variávelusernamedefinida primeiro, você receberá um erro de nome com a mensagemNameError: name 'username' is not defined. - TypeError: Este é o erro que o Python lança quando você realiza uma operação em dois ou mais tipos de dados incompatíveis. Por exemplo, se você tentar adicionar uma string a um número, você receberá o erro
TypeError: can only concatenate str (not "int") to str. - IndexError: Você receberá um
IndexErrorse acessar um índice que não existe em uma lista ou outras sequências como tuple e string. Por exemplo, em uma stringHello world, o índice do último caractere é11. Se você acessar um caractere desta forma,greet = "hello world"; print(greet[12]), você receberá um erro com a mensagemIndexError: string index out of range. - AttributeError: Python gera esse erro quando você tenta usar um método ou propriedade que não existe em um objeto desse tipo. Por exemplo, chamar
.append()em uma string como"hello".append("!")levará a um erro com a mensagemAttributeError: 'str' object has no attribute 'append'.
Boas técnicas de depuração em Python
- Usando a função
print: Inserir declaraçõesprint()em vários pontos do seu código durante a depuração ajuda você a ver os valores das variáveis e como seu código flui. - Usando o depurador embutido do Python (
pdb): Python fornece um módulopdbpara depuração. Ele faz parte da biblioteca padrão do Python, então está sempre disponível para uso. Com opdb, você pode definir um trace com a funçãoset_trace()para começar a executar o código passo a passo e inspecionar variáveis de forma interativa. - Aproveitando as ferramentas de depuração do IDE: Muitos ambientes de desenvolvimento integrados (IDEs) e editores de código como Pycharm e VS Code oferecem ferramentas de depuração com breakpoints, execução passo a passo, inspeção de variáveis e outros recursos de depuração.
Tratamento de exceções
try...except: Isso é usado para executar um bloco de código que pode gerar uma exceção. O blocotryé onde você antecipa que um erro pode ocorrer, enquanto o blocoexceptcaptura uma exceção especificada e é executado se esse erro especificado for gerado. Aqui está um exemplo:
try:
print(22 / 0)
except ZeroDivisionError:
print('You can\'t divide by zero!')
# You can't divide by zero!
Você também pode encadear múltiplos blocos except para que possa tratar mais tipos de exceções:
try:
number = int(input('Enter a number: '))
print(22 / number)
except ZeroDivisionError:
print('You cannot divide by zero!')
# You cannot divide by zero! prints when you enter 0
except ValueError:
print('Please enter a valid number!')
# Please enter a valid number! prints when you enter a string
elseefinally: Esses blocos estendemtry...except. Se nenhuma exceção ocorrer, o blocoelseé executado. O blocofinallysempre é executado independentemente de erros.
try:
result = 100 / 4
except ZeroDivisionError:
print('You cannot divide by zero!') # This will not run
else:
print(f'Result is {result}') # Result is 25.0
finally:
print('Execution complete!') # Execution complete!
- Objeto de exceção: Isso permite que você acesse a exceção em si para um melhor debug e para imprimir a mensagem de erro direta. Para acessar o objeto de exceção, você precisa usar a palavra-chave
as. Aqui está um exemplo:
try:
value = int('This will raise an error')
except ValueError as e:
print(f'Caught an error: {e}')
# Caught an error: invalid literal for int() with base 10: 'This will raise an error'
- A declaração
raise: Isso permite que você levante manualmente uma exceção. Você pode usá-la para lançar uma exceção quando uma determinada condição for atendida. Aqui está um exemplo:
def divide(a, b):
if b == 0:
raise ZeroDivisionError('You cannot divide by zero')
return a / b
Sinalização de exceção
A instruçãoraise também é útil quando você cria suas próprias exceções personalizadas, pois pode usá-la para lançar uma exceção com uma mensagem personalizada. Aqui está um exemplo disso:
class InvalidCredentialsError(Exception):
def __init__(self, message="Invalid username or password"):
self.message = message
super().__init__(self.message)
def login(username, password):
stored_username = "admin"
stored_password = "password123"
if username != stored_username or password != stored_password:
raise InvalidCredentialsError()
return f"Welcome, {username}!"
Aqui está como você pode usar a login função com a exceção InvalidCredentialsError:
# failed login attempt
try:
message = login("user", "wrongpassword")
except InvalidCredentialsError as e:
print(f"Login failed: {e}")
else:
print(message)
# successful login attempt
try:
message = login("admin", "password123")
except InvalidCredentialsError as e:
# This block is not executed because the login was successful
print(f"Login failed: {e}")
else:
# The else block runs if the 'try' block completes without an exception
print(message)
A instrução raise também pode ser usada com a palavra-chave from para encadear exceções, mostrando a relação entre diferentes erros:
def parse_config(filename):
try:
with open(filename, 'r') as file:
data = file.read()
return int(data)
except FileNotFoundError:
raise ValueError('Configuration file is missing') from None
except ValueError as e:
raise ValueError('Invalid configuration format') from e
config = parse_config('config.txt')
# --assignment--
Revise os tópicos e conceitos de tratamento de erros.