如何抑制使用pyshark的Python代码中析构函数的异常输出?
解决pyshark在__del__中抛出未捕获异常的方法
你遇到的问题是因为异常是在Capture对象的__del__方法(垃圾回收时自动调用)里抛出的,普通的try-except管不到这个阶段的异常。下面是几个能抑制该异常输出的可行方法:
方法1:手动调用close并捕获异常
主动在finally块里调用capture.close(),并捕获TSharkCrashException,这样垃圾回收时__del__里的close逻辑不会重复触发异常:
import pyshark from pyshark.capture.capture import TSharkCrashException filename = "/home/alex/Work/Data/test.pcap" capture = pyshark.FileCapture(filename) try: for packet in capture: pass except: print("exception") finally: try: capture.close() except TSharkCrashException: # 忽略TShark崩溃的异常 pass
方法2:重定向TShark的错误输出
创建FileCapture时,将TShark的stderr重定向到空设备,这样pyshark无法获取到TShark的崩溃信息,也就不会抛出异常:
import pyshark filename = "/home/alex/Work/Data/test.pcap" # Linux下重定向到/dev/null,Windows可替换为"NUL" capture = pyshark.FileCapture(filename, stderr=open('/dev/null', 'w')) try: for packet in capture: pass except: print("exception")
方法3:全局忽略特定异常
通过修改sys.excepthook,定向忽略TSharkCrashException类型的异常,用完记得恢复原钩子避免影响其他逻辑:
import sys import pyshark from pyshark.capture.capture import TSharkCrashException # 保存原异常处理钩子 original_hook = sys.excepthook def ignore_tshark_crash(exctype, value, traceback): # 仅忽略TShark崩溃相关异常 if exctype == TSharkCrashException and "seems to have crashed" in str(value): return # 其他异常沿用原处理逻辑 original_hook(exctype, value, traceback) sys.excepthook = ignore_tshark_crash filename = "/home/alex/Work/Data/test.pcap" capture = pyshark.FileCapture(filename) try: for packet in capture: pass except: print("exception") # 恢复原异常处理钩子 sys.excepthook = original_hook
方法4:Monkey Patch禁用__del__方法
直接替换Capture类的__del__方法为空实现,避免自动调用close抛出异常(注意:可能导致资源泄漏,仅临时场景使用):
import pyshark from pyshark.capture.capture import Capture # 保存原__del__方法 original_del = Capture.__del__ # 替换为空方法 Capture.__del__ = lambda self: None filename = "/home/alex/Work/Data/test.pcap" capture = pyshark.FileCapture(filename) try: for packet in capture: pass except: print("exception") # 恢复原__del__方法 Capture.__del__ = original_del
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

