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

如何抑制使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:45:00