2013-05-18 33 views
6

Ứng dụng của tôi có thư viện âm thanh tùy chỉnh tự sử dụng thư viện BASS.Truy tìm ngoại lệ bị bỏ qua trong Python?

Tôi tạo và hủy các đối tượng luồng BASS trong suốt chương trình.

Khi thoát chương trình của tôi, một cách ngẫu nhiên (Tôi đã không tìm ra mô hình nào) tôi nhận được thông báo sau trên giao diện điều khiển của tôi:

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

thư viện âm thanh của tôi (audio/audio_player.py [lớp Suối]) chứa một lớp tạo ra một đối tượng dòng BASS và sau đó cho phép mã thao tác nó. Khi lớp bị phá hủy (trong số del thường lệ), nó gọi BASS_StreamFree để xóa bất kỳ tài nguyên nào mà BASS có thể đã cấp phát.

(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.. 

nghiêng đầu tiên của tôi dựa trên thông điệp này là nơi nào đó trong mã của tôi, một thể hiện của lớp dòng của tôi đang được mồ côi (không còn được gán cho một biến) và Python vẫn đang cố gắng gọi hàm del của ứng dụng khi ứng dụng đóng, nhưng vào thời điểm nó cố gắng, đối tượng đã biến mất.

Ứng dụng này sử dụng wxWidgets và do đó liên quan đến một số luồng. Thực tế là tôi không được đưa ra một tên biến thực sự khiến tôi tin những gì tôi đã nói trong đoạn trước.

Tôi không chắc chắn chính xác mã nào sẽ liên quan đến gỡ lỗi này. Thông điệp dường như vô hại nhưng tôi không thích ý tưởng về một ngoại lệ "bị bỏ qua" trong mã sản xuất cuối cùng.

Có mẹo nào để gỡ lỗi này không?

+0

"wxWidgets" Rất tiếc, mong đợi mọi thứ biến mất khi bạn không mong đợi điều đó trừ khi bạn làm việc nhiều hơn. –

Trả lời

7

Thông báo rằng ngoại lệ bị bỏ qua là vì tất cả ngoại lệ được nêu trong phương thức __del__ đều bị bỏ qua để giữ cho mô hình dữ liệu được sàng lọc. Dưới đây là phần có liên quan của the docs:

Cảnh báo: Do các trường hợp bấp bênh theo đó __del__() phương pháp được gọi, trường hợp ngoại lệ xảy ra trong khi thực hiện của họ sẽ được bỏ qua, và một cảnh báo được in để sys.stderr để thay thế. Ngoài ra, khi __del__() được gọi để đáp ứng với một mô-đun bị xóa (ví dụ, khi thực hiện chương trình được thực hiện), các globals khác được tham chiếu theo phương pháp __del__() có thể đã bị xóa hoặc trong quá trình bị rách (ví dụ: máy móc nhập khẩu đang Tắt). Vì lý do này, các phương pháp __del__() nên thực hiện tối thiểu tuyệt đối cần thiết để duy trì các bất biến bên ngoài. Bắt đầu với phiên bản 1.5, Python đảm bảo rằng các hình cầu có tên bắt đầu bằng một dấu gạch dưới đơn sẽ bị xóa khỏi mô đun của chúng trước khi các hình cầu khác bị xóa; nếu không có các tham chiếu khác cho các hình cầu đó tồn tại, điều này có thể giúp đảm bảo rằng các mô-đun đã nhập vẫn có sẵn tại thời điểm phương thức __del__() được gọi.

Như để gỡ lỗi nó, bạn có thể bắt đầu bằng cách đặt một khối try/except xung quanh mã trong phương pháp __del__ của bạn và in ra thêm thông tin về trạng thái của chương trình vào thời điểm nó xảy ra. Hoặc bạn có thể xem xét làm ít hơn trong phương pháp __del__ hoặc loại bỏ hoàn toàn!

+0

Bạn đã đúng.Ngoại lệ đã được gây ra trong phương thức '__del__'. Tôi chỉ bọc cuộc gọi bên trong một thử/nắm bắt và tất cả có vẻ tốt bây giờ. – fdmillion

Các vấn đề liên quan