Prenda-me se for capaz: um guia para lidar com exceções em Python
Desbloqueie todo o potencial do Python por meio do gerenciamento inteligente de exceções
Como desenvolvedor de software, lidar com exceções costuma ser visto como um mal necessário. No entanto, o domínio do sistema de tratamento de exceções do Python pode torná-lo um programador mais eficiente e eficaz.
Nesta postagem do blog, fornecerei uma explicação detalhada sobre o seguinte:
- O que é Tratamento de Exceções?
- A diferença entre
if
declarações e tratamento de exceções - Uso
else
efinally
cláusulas para gerenciamento adequado de erros - Definindo exceções personalizadas
- Práticas recomendadas para tratamento de exceções
manipulação de exceção é um processo de escrever código para capturar e manipular erros ou exceções que podem ocorrer durante a execução do programa. Isso permite que os desenvolvedores escrevam um código robusto que continua a ser executado mesmo diante de eventos ou erros inesperados, em vez de travar completamente.
Quando ocorre uma exceção, o Python procura um manipulador de exceção correspondente. O código do manipulador será executado e tomará as ações apropriadas, como registrar o erro, exibir uma mensagem de erro ou tentar se recuperar do erro. No geral, o tratamento de exceções ajuda a tornar os aplicativos Python mais confiáveis, sustentáveis e fáceis de depurar.
A diferença entre if
declarações e tratamento de exceções
As principais diferenças entre if
instruções e manipulação de exceção em Python estão em seus respectivos objetivos e cenários de uso.
A if
declaração serve como um bloco de construção básico para programação estruturada. Ele avalia uma condição e executa diferentes blocos de código com base em se a condição é verdadeira ou falsa. Aqui está um exemplo:
temperature = int(input("Please enter temperature in Fahrenheit: "))
if temperature > 100:
print("Hot weather alert! Temperature exceeded 100°F.")
elif temperature >= 70:
print("Warm day ahead, enjoy sunny skies.")
else:
print("Bundle up for chilly temperatures.")
As exceções são usadas para sinalizar problemas e indicar áreas no código que precisam de melhorias, depuração ou medidas adicionais de verificação de erros. Eles permitem que o Python lide normalmente com situações errôneas e continue executando o script em vez de terminar abruptamente.
Considere o seguinte exemplo de como você pode implementar o tratamento de exceções para gerenciar melhor possíveis falhas relacionadas à divisão por zero:
# Define a function that tries to divide a number by zero
def divide(x, y):
result = x / y
return result
# Call the divide function with x=5 and y=0
result = divide(5, 0)
print(f"Result of dividing {x} by {y}: {result}")
Traceback (most recent call last):
File "<stdin>", line 8, in <module>
ZeroDivisionError: division by zero attempted
Podemos lidar com a exceção acima agrupando a chamada para a função “divide” dentro de um try-except
bloco da seguinte forma:
# Define a function that tries to divide a number by zero
def divide(x, y):
result = x / y
return result
# Call the divide function with x=5 and y=0
try:
result = divide(5, 0)
print(f"Result of dividing {x} by {y}: {result}")
except ZeroDivisionError:
print("Cannot divide by zero.")
Cannot divide by zero.
Para obter mais informações sobre as exceções internas do Python, consulte [2] .
Usando as cláusulas Else e Finalmente para o gerenciamento adequado de erros
Ao trabalhar com exceções em Python, é recomendável incluir cláusulas else
e finally
em seus try-except
blocos. A else
cláusula permite que você especifique o que deve acontecer se nenhuma exceção for gerada, enquanto a finally
cláusula garante que certas operações de limpeza sejam sempre executadas, independentemente de ter ocorrido uma exceção [1] [2] .
Por exemplo, considere um cenário em que você deseja ler dados de um arquivo e executar algumas operações nesses dados. Se ocorrer uma exceção durante a leitura do arquivo, convém registrar o erro e interromper o processamento, mas você ainda deseja fechar o arquivo corretamente.
Usar as cláusulas else
e finally
permitiria que você fizesse exatamente isso - processasse os dados normalmente se nenhuma exceção ocorresse ou manuseasse quaisquer exceções apropriadamente enquanto ainda fechava o arquivo no final. Sem essas cláusulas, seu código ficaria vulnerável a vazamentos de recursos ou tratamento incompleto de erros. Assim, eles desempenham papéis essenciais na criação de programas robustos e confiáveis.
try:
# Open the file in read mode
file = open("file.txt", "r")
print("Successful opened the file")
except FileNotFoundError:
# Handle missing files
print("File Not Found Error: No such file or directory")
exit()
except PermissionError:
# Handle permission issues
print("Permission Denied Error: Access is denied")
else:
# All good, do something with the file data
content = file.read().decode('utf-8')
processed_data = process_content(content)
# Cleanup after ourselves even if an exception occurred above
finally:
file.close()
Caso contrário, quando não ocorrer nenhuma exceção dentro do try
bloco, prosseguiremos com o processamento do conteúdo do arquivo na else
ramificação. Por fim, a operação de limpeza assegurada pelo finally
bloco fecha o arquivo independentemente de uma exceção ter sido levantada anteriormente ou não [1] .
Adotando uma abordagem estruturada como essa, seu código permanece organizado e fácil de seguir, ao mesmo tempo em que contabiliza possíveis erros que podem surgir da interação com sistemas ou entradas externas.
Definindo exceções personalizadas
Em Python, você pode definir exceções personalizadas criando subclasses de exceções internas, como Exception
ou qualquer outra classe que herde diretamente de Exception
.
Para fazer isso, você precisa criar uma nova classe que herde de uma dessas exceções básicas e adicionar atributos específicos para suas necessidades. Você pode usar sua classe de exceção recém-definida em todo o código, assim como usaria qualquer outra classe de exceção integrada.
Aqui está um exemplo de definição de uma exceção personalizada chamada InvalidEmailAddress
:
class InvalidEmailAddress(ValueError):
def __init__(self, message):
super().__init__(message)
self.msgfmt = message
Você pode gerar essa exceção sempre que encontrar um formato de endereço de e-mail inválido:
def send_email(address):
if isinstance(address, str) == False:
raise InvalidEmailAddress("Invalid email address")
# Send email
>>> send_email(None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/path/to/project/main.py", line 8, in send_email
raise InvalidEmailAddress("Invalid email address")
InvalidEmailAddress: Invalid email address
Aqui estão algumas práticas recomendadas relacionadas ao tratamento de erros em Python:
- Design para falha : Planeje com antecedência considerando possíveis falhas e projetando seu programa para lidar com elas normalmente. Isso significa antecipar casos extremos e implementar manipuladores de erros apropriados.
- Use mensagens de erro descritivas : forneça mensagens de erro ou logs detalhados que ajudem os usuários a entender o que deu errado e por quê. Evite mensagens de erro genéricas como “Ocorreu um erro” ou “Aconteceu algo ruim”. Em vez disso, exiba uma mensagem amigável que sugira soluções ou forneça links para documentação. Certifique-se de encontrar um equilíbrio entre fornecer instruções detalhadas e evitar sobrecarregar a interface do usuário com conteúdo estranho.
- Minimizar efeitos colaterais : Minimize as consequências de ações com falha isolando seções de código problemáticas por meio de blocos try-finally ou try-with-resources. Garanta que as tarefas de limpeza sempre sejam executadas, independentemente dos resultados de sucesso ou falha.
- Teste completamente : Teste completamente: certifique-se de que seus manipuladores de exceção se comportem corretamente em vários cenários executando testes abrangentes.
- Refatore regularmente : Refatore segmentos de código propensos a erros para melhorar sua confiabilidade e desempenho. Mantenha sua base de código modular e levemente acoplada, permitindo que partes independentes evoluam independentemente sem afetar outras negativamente.
- Registrar eventos importantes: acompanhe ocorrências interessantes em seu aplicativo, registrando-as em um arquivo ou saída de console. Isso ajuda você a diagnosticar problemas rapidamente sem ter que examinar grandes quantidades de logs não estruturados.
Escrever código de tratamento de erros é parte integrante do desenvolvimento de software, principalmente ao trabalhar com Python, pois permite que os desenvolvedores criem aplicativos mais confiáveis e robustos. Seguindo os padrões e práticas recomendadas do setor, os desenvolvedores podem reduzir o tempo de depuração, garantir a qualidade do código e fornecer melhores experiências ao usuário.
Recursos
[1]https://docs.python.org/3/tutorial/errors.html
[2]https://www.geeksforgeeks.org/python-exception-handling/