2013-05-18 31 views
6

我的应用程序有一个自己使用BASS库的自定义音频库。在Python中追踪被忽略的异常?

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

当我的程序退出时,随机(我还没有想出的格局还没有)我得到我的控制台上通知如下:

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

我的音频库(音频/ audio_player.py [类流] )包含一个创建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,因此涉及一些线程。我没有给出实际变量名的事实使我相信我在前一段中所说的内容。

我不确定究竟哪个代码与调试相关。该信息看起来似乎无害,但我不喜欢在最终生产代码中出现“忽略”异常的想法。

是否有任何提示任何人有调试呢?

+0

“wxWidgets”呃哦,当你不期待它时,希望东西消失,除非你做更多的工作。 –

回答

7

该异常被忽略的消息是因为在__del__方法中引发的所有异常都会被忽略,以保持数据模型的正常。下面是the docs相关部分:

警告:由于其执行过程中发生不稳定的情况下可调用__del__()方法,异常被忽略,并且打印一个警告,而不是在sys.stderr。另外,当调用__del__()以响应模块被删除(例如,当程序执行完成时),由__del__()方法引用的其他全局变量可能已经被删除或正在被拆除的过程中(例如,进口机器关闭)。出于这个原因,__del__()方法应该保持外部不变量所需的绝对最小值。从版本1.5开始,Python保证在删除其他全局变量之前,将名称以单个下划线开头的全局变量从模块中删除;如果不存在对这种全局变量的其他引用,这可能有助于确保在调用__del__()方法时导入的模块仍然可用。

至于调试它,你可以通过它发生的时间把一个try/except块周围的代码在你的__del__方法和打印出更多有关该程序的状态下启动。或者你可以考虑在__del__方法中少做,或者完全摆脱它!

+0

你说得对。异常是在'__del__'方法中引起的。我只是将这个调用包装在try/catch中,现在看起来都不错。 – fdmillion