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
相关产品推荐
相关产品推荐

