fdm*_*ion 6 python ignore exception
我的应用程序有一个自定义音频库,它本身使用BASS库.
我在整个程序中创建并销毁BASS流对象.
当我的程序随机退出时(我还没有弄清楚模式)我在控制台上收到以下通知:
Exception TypeError: "'NoneType' object is not callable" in <bound method stream.__del__ of <audio.audio_player.stream object at 0xaeda2f0>> ignored
Run Code Online (Sandbox Code Playgroud)
我的音频库(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..
Run Code Online (Sandbox Code Playgroud)
我根据这条消息的第一个倾向是在我的代码的某个地方,我流的类的实例被孤立(不再分配给一个变量)和Python仍试图调用其删除时,应用程序关闭功能,而是由时间它试图对象已经消失了.
这个应用程序使用wxWidgets,因此涉及一些线程.事实上,我没有获得实际的变量名称,这让我相信我在前一段中所说的内容.
我不确定哪些代码与调试相关.该消息似乎无害,但我不喜欢最终生产代码中"被忽略"异常的想法.
是否有任何人有调试这个的提示?
忽略该异常的消息是因为忽略了__del__方法中引发的所有异常以保持数据模型的正常.这是文档的相关部分:
警告:由于
__del__()调用方法的不稳定情况,将忽略执行期间发生的异常,并向sys.stderr输出警告.此外,当__del__()响应于被删除的模块而调用时(例如,当完成程序的执行时),该__del__()方法引用的其他全局变量可能已被删除或正在被拆除(例如,导入机器关闭) ).因此,__del__()方法应该做到维持外部不变量所需的绝对最小值.从版本1.5开始,Python保证在删除其他全局变量之前,从其模块中删除名称以单个下划线开头的全局变量; 如果不存在对此类全局变量的其他引用,这可能有助于确保在__del__()调用方法时导入的模块仍然可用.
至于调试它,您可以先在方法中的代码周围放置一个try/ exceptblock,然后在__del__程序发生时打印出有关程序状态的更多信息.或者你可以考虑减少__del__方法,或完全摆脱它!
| 归档时间: |
|
| 查看次数: |
3971 次 |
| 最近记录: |