Context Manager e Exceções
O que é?
Um Context Manager em Python é uma estrutura que permite configurar e liberar recursos automaticamente, como conexões de rede, arquivos ou bancos de dados. Ele é usado com a palavra-chave with, que garante que o recurso seja liberado (fechado) mesmo se ocorrer um erro.
Estrutura básica:
with Recurso() as nome_recurso:
# Código que usa o recurso
# Após o bloco, o recurso é liberado automaticamente
-
O método
__enter__é chamado ao entrar no blocowith(configura o recurso). -
O método
__exit__é chamado ao sair do bloco (libera o recurso, mesmo em caso de erro).
Benefícios:
-
Garante que conexões sejam fechadas automaticamente.
-
Reduz o risco de vazamento de recursos.
-
Simplifica o código, eliminando a necessidade de chamadas manuais como
close()oudisconnect().
Context Managers no Netmiko
from netmiko import ConnectHandler
# Configuração do dispositivo
device = {
"device_type": "cisco_ios",
"host": "r1",
"username": "admin",
"password": "autonetops",
}
with ConnectHandler(**device) as conn:
# Executa um comando
output = conn.send_command("show version")
print("Saída do comando:\n", output)
# A conexão é fechada automaticamente ao sair do bloco 'with'
Exceções
O que é try-except?
O bloco try-except em Python é usado para capturar e tratar erros (exceções) que podem ocorrer durante a execução de um código. Isso é especialmente útil para nós, pois conexões podem falhar, dispositivos podem estar indisponíveis ou comandos podem gerar erros.
Estrutura básica:
try:
# Código que pode gerar erro
except Exception as e:
# Código para lidar com o erro
print(f"Erro ocorrido: {e}")
Aplicação
from netmiko import ConnectHandler, NetmikoTimeoutException, NetmikoAuthenticationException
# Configuração do dispositivo
device = {
"device_type": "cisco_ios",
"host": "r1",
"username": "admin",
"password": "autonetops",
}
try:
# Tenta conectar ao dispositivo
with ConnectHandler(**device) as conn:
# Executa um comando
output = conn.send_command("show version")
print("Saída do comando:\n", output)
except NetmikoTimeoutException:
print("Erro: Não foi possível conectar ao dispositivo (timeout). Verifique a conexão de rede.")
except NetmikoAuthenticationException:
print("Erro: Falha na autenticação. Verifique o usuário/senha.")
except Exception as e:
print(f"Erro inesperado: {e}")
Explicação:
-
Capturamos erros específicos como
NetmikoTimeoutException(falha de conexão) eNetmikoAuthenticationException(falha de autenticação). -
Um
except Exceptiongenérico captura outros erros inesperados. -
O código tenta executar o comando
show versione imprime a saída, mas trata possíveis falhas.
Boas Práticas com try-except
-
Especificidade nos erros: Sempre capture exceções específicas (como
NetmikoTimeoutExceptionouConnectionException) antes de usar umexcept Exceptiongenérico. -
Logs detalhados: Imprima ou registre o erro (
print(f"Erro: {e}")) para facilitar a depuração.
Exercício
Simule e crie exceções com device_type errado, erro de autenticação e erro de acesso a um IP ou DNS