You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python遍历IP连接Cisco设备报错后如何继续执行循环

问题根因

你的try/except包裹范围错误:整个for循环都被放在外层try块中,循环执行时只要任意一个IP的连接、配置拉取、文件写入环节抛出异常,就会立刻跳出整个for循环,进入外层except分支,后续IP自然不会被遍历到。把代码挪到else分支无法解决问题,因为异常捕获的作用范围依然覆盖整个循环,异常触发后还是会终止全量循环流程。

修复方法

将异常捕获逻辑下沉到for循环内部,对每个IP的备份流程单独做异常处理:单台设备操作失败时,仅终止当前设备的处理流程,打印错误信息后自动进入下一台设备的遍历,不会中断整体备份任务。
建议同时补充几个稳定性优化:

  • 单独捕获Netmiko的连接超时、认证失败专属异常,方便快速定位故障原因
  • 增加连接资源释放逻辑,避免操作中途报错时残留未关闭的SSH连接
  • 用上下文管理器处理文件写入,无需手动调用close,异常场景下也能正常释放文件句柄

修改后的可运行代码如下:

from netmiko import ConnectHandler
from netmiko.exceptions import NetMikoTimeoutException, NetMikoAuthenticationException

def backupAll(): 
    for element in ipArray:
        wRouter = {
            "device_type": "cisco_ios",
            "ip": element,
            "username": 'test',
            "password": 'cisco',
            "secret": 'cisco',
        }
        conn = None
        try:
            conn = ConnectHandler(**wRouter)
            conn.enable()
            hostname_raw = conn.send_command("show run | inc hostname")
            hostName = str(hostname_raw).strip()
            run_config = conn.send_command("show run")
            # 上下文管理器自动处理文件关闭,避免句柄泄漏
            with open(f'{hostName}.txt', 'w', encoding='utf-8') as save_file:
                save_file.write(run_config)
            print(f'{hostName}(IP:{element})备份完成')
        except NetMikoTimeoutException:
            print(f'IP {element} 连接超时,跳过该设备')
        except NetMikoAuthenticationException:
            print(f'IP {element} 用户名/密码认证失败,跳过该设备')
        except Exception as ex:
            print(f'IP {element} 备份失败,错误信息:{str(ex)}')
        finally:
            # 只要连接建立成功,无论操作成功/失败都主动断开
            if conn:
                conn.disconnect()

内容的提问来源于stack exchange,提问作者maboom89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:54:22