跟踪Python中被忽略的异常?

时间:2013-05-18 05:11:44

标签: python exception ignore

我的应用程序有一个自定义音频库,它本身使用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,因此涉及一些线程。事实上,我没有获得实际的变量名称,这让我相信我在前一段中所说的内容。

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

是否有任何人有调试这个的提示?

1 个答案:

答案 0 :(得分:8)

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

  

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

至于调试它,您可以先在try方法的代码周围放置一个except / __del__块,然后打印出有关该程序状态的更多信息。发生。或者你可以考虑在__del__方法中做得更少,或完全摆脱它!