【问题标题】:Tracing an ignored exception in Python?在 Python 中跟踪被忽略的异常?
【发布时间】:2013-05-18 05:11:44
【问题描述】:

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

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

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

【问题讨论】:

  • "wxWidgets" 哦哦,除非你做更多的工作,否则当你没想到的东西会消失的时候。

标签: python exception


【解决方案1】:

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

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

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

【讨论】:

  • 你是对的。异常是在__del__ 方法中引起的。我刚刚将调用封装在 try/catch 中,现在一切似乎都很好。
猜你喜欢
  • 2012-03-11
  • 2014-08-19
  • 2017-12-07
  • 1970-01-01
  • 2023-04-03
  • 2021-04-17
  • 1970-01-01
  • 2012-03-03
  • 2012-06-01
相关资源
最近更新 更多