我的应用程序有一个自定义音频库,它本身使用BASS库。

我在整个程序中创建和销毁BASS流对象。

当我的程序退出时,随机地(我还没有弄清楚模式)在控制台上收到以下通知:

Exception TypeError: "'NoneType' object is not callable" in <bound method stream.__del__ of <audio.audio_player.stream object at 0xaeda2f0>> ignored

我的音频库(audio/audio_player.py [class Stream])包含一个类,该类创建BASS流对象,然后允许代码对其进行操作。当类被销毁时(在 del 例程中),它调用BASS_StreamFree清除BASS可能分配的任何资源。

(audio_player.py)
from pybass import *
from ctypes import pointer, c_float, c_long, c_ulong, c_buffer
import os.path, time, threading

# initialize the BASS engine
BASS_Init(-1, 44100, 0, 0, None)

class stream(object):
    """Represents a single audio stream"""
    def __init__(self, file):
        # check for file existence
        if (os.path.isfile(file) == False):
            raise ValueError("File %s not found." % file)
        # initialize a bass channel
        self.cAddress = BASS_StreamCreateFile(False, file, 0, 0, 0)
    def __del__(self):
        BASS_StreamFree(self.cAddress)
    def play(self):
        BASS_ChannelPlay(self.cAddress, True)
        while (self.playing == False):
            pass
    ..more code..

基于此消息的第一个倾向是,在我的代码中的某个地方,我的流类的一个实例正在孤立(不再分配给变量),并且Python仍在尝试关闭应用程序时尝试调用其 del 函数,但是通过它尝试物体的时间消失了。

此应用程序确实使用wxWidgets,因此涉及一些线程。没有给我一个实际的变量名这一事实使我相信我在上一段中所说的。

我不确定确切的代码与调试有关。该消息似乎无害,但我不喜欢最终生产代码中“被忽略”异常的想法。

有任何技巧可以调试吗?

最佳答案

忽略该异常的消息是因为忽略了__del__方法中引发的所有异常,以使数据模型保持健全。这是the docs的相关部分:



至于调试,您可以从在try方法中的代码周围放置一个except/__del__块开始,并在程序发生时打印出有关程序状态的更多信息。或者,您可以考虑减少__del__方法的工作量,或者完全摆脱它!

10-04 21:00