Python捕获Paramiko IncompatiblePeer异常仍输出堆栈,如何屏蔽?
解决Paramiko捕获异常后仍输出堆栈跟踪的问题
你遇到的问题是Paramiko内部Transport线程在处理SSH连接协商时抛出异常,由其内置日志系统打印了堆栈信息,这个输出不受主线程try-except块控制——你的代码确实已经捕获了顶层的IncompatiblePeer异常(所以最后会输出got IncompatiblePeer),但之前的堆栈是Paramiko日志打印的内容。
要屏蔽这个堆栈跟踪,最直接的方法是调整Paramiko的日志级别,抑制它的错误日志输出:
解决方案:修改Paramiko日志配置
在代码开头添加以下内容,将Paramiko的日志级别设为仅输出最严重的错误,或者直接禁用其日志输出:
import logging # 获取Paramiko的日志实例 paramiko_logger = logging.getLogger("paramiko") # 将日志级别设为CRITICAL,低于该级别的日志(如ERROR)会被屏蔽 paramiko_logger.setLevel(logging.CRITICAL) # 可选:清空已有的日志处理器,彻底阻止日志输出 paramiko_logger.handlers = []
修改后的完整代码示例:
#!/usr/bin/env python3 import logging import paramiko from paramiko import SSHClient from paramiko.ssh_exception import IncompatiblePeer # 屏蔽Paramiko的低级别日志 paramiko_logger = logging.getLogger("paramiko") paramiko_logger.setLevel(logging.CRITICAL) paramiko_logger.handlers = [] xkey = paramiko.RSAKey.from_private_key_file('./tests/ssh/rsa/valid') client = SSHClient() client.load_system_host_keys() client.set_missing_host_key_policy(paramiko.AutoAddPolicy) try: client.connect('192.168.1.2', username='username', pkey=xkey) except IncompatiblePeer as e: print('got IncompatiblePeer') except Exception as e: print(f"raw except: {e}")
补充说明
如果仅需屏蔽特定异常日志,也可以自定义日志过滤器,但对于你的测试场景,直接提升日志级别是最简单高效的方式,既不会影响测试逻辑,也能避免无关堆栈信息干扰输出。
内容的提问来源于stack exchange,提问作者montjoie
相关产品推荐
相关产品推荐

