Context Manager e Exceções

Chapter 2, Lesson 2

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 bloco with (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() ou disconnect().


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'

💡
Use sempre que possível: Context Managers simplificam o gerenciamento de conexões e evitam erros como esquecer de fechar uma conexão.

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) e NetmikoAuthenticationException (falha de autenticação).

  • Um except Exception genérico captura outros erros inesperados.

  • O código tenta executar o comando show version e imprime a saída, mas trata possíveis falhas.

Boas Práticas com try-except

  1. Especificidade nos erros: Sempre capture exceções específicas (como NetmikoTimeoutException ou ConnectionException) antes de usar um except Exception genérico.

  2. Logs detalhados: Imprima ou registre o erro (print(f"Erro: {e}")) para facilitar a depuração.

💡
Simule falhas (como IP incorreto ou senha errada) para garantir que o tratamento de erros funciona.

Exercício

Laboratório

Simule e crie exceções com device_type errado, erro de autenticação e erro de acesso a um IP ou DNS