2012-03-21 34 views
12

Tôi đang chạy một chương trình iOS trong Trình mô phỏng 4.3.2, 5.0 và 5.1 và tôi đang gặp phải một ngoại lệ lạ trong AudioToolbox. Tôi có một breakpoint đặt trong Xcode (Xcode 4.3.1, chạy trên 10.7.3) cho tất cả các trường hợp ngoại lệ, và trình gỡ lỗi được phá vỡ trong một cuộc gọi đến AudioServicesCreateSystemSoundID():Tại sao AudioServicesCreateSystemSoundID ném ngoại lệ bên trong nhưng trả lại 0 dưới dạng mã lỗi?

SystemSoundID soundID; 
OSStatus errorCode = AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID); 
        //^boom.^

Các vết lùi:

(lldb) bt 
* thread #1: tid = 0x1f03, 0x9000e230 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 1.2 
frame #0: 0x9000e230 libc++abi.dylib`__cxa_throw 
frame #1: 0x00144193 AudioToolbox`ID3ParserHandle::ID3ParserHandle(void*, long (*)(void*, unsigned long, unsigned long, unsigned long, void**, unsigned long*)) + 259 
frame #2: 0x001442de AudioToolbox`ID3ParserOpen + 62 
frame #3: 0x0006c0e7 AudioToolbox`MPEGAudioFile::ParseID3Tags() + 87 
frame #4: 0x0006c2ba AudioToolbox`MPEGAudioFile::ParseAudioFile() + 26 
frame #5: 0x00015153 AudioToolbox`AudioFileOpenWithCallbacks + 371 
frame #6: 0x00027020 AudioToolbox`_ZL15VerifyAndMapURLPK7__CFURLRx + 448 
frame #7: 0x00026d85 AudioToolbox`_ZL18ActionDataToServerPK7__CFURLm + 933 
frame #8: 0x000da26b AudioToolbox`AudioServicesCreateSystemSoundID + 235 
frame #9: 0x00005be1 app`-[SoundsViewController playSoundForPath:] + 257 at SoundsViewController.m:161 
frame #10: 0x00005a99 app`-[SoundsViewController tableView:didSelectRowAtIndexPath:] + 777 at SoundsViewController.m:129 
frame #11: 0x0029db68 UIKit`-[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1140 
frame #12: 0x00293b05 UIKit`-[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 219 
frame #13: 0x009ad79e Foundation`__NSFireDelayedPerform + 441 
frame #14: 0x00fb58c3 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19 
frame #15: 0x00fb6e74 CoreFoundation`__CFRunLoopDoTimer + 1220 
frame #16: 0x00f132c9 CoreFoundation`__CFRunLoopRun + 1817 
frame #17: 0x00f12840 CoreFoundation`CFRunLoopRunSpecific + 208 
frame #18: 0x00f12761 CoreFoundation`CFRunLoopRunInMode + 97 
frame #19: 0x01f6b1c4 GraphicsServices`GSEventRunModal + 217 
frame #20: 0x01f6b289 GraphicsServices`GSEventRun + 115 
frame #21: 0x00234c93 UIKit`UIApplicationMain + 1160 
frame #22: 0x00002c45 app`main + 181 at main.m:14 

Tuy nhiên, các tập tin âm thanh trong soundID được tạo thành công, và các mã lỗi OSStatus rằng AudioServicesCreateSystemSoundID lợi nhuận là 0.

Điều này xảy ra trong tất cả ba phiên bản iOS Simulator tôi đã cài đặt, và trên iPhone của tôi chạy 5.1.

Dường như đây là cùng một dấu backtrace chung là AVAudioPlayer throws breakpoint in debug mode, mặc dù của tôi là kết quả của một yêu cầu trực tiếp hơn của AudioToolbox.

Tôi muốn gửi tệp này với Apple, vì đó là lỗi trong AudioToolbox (khung không nên sử dụng ngoại lệ cho kiểm soát luồng, trên bbum và các loại khác), nhưng trước khi thực hiện, tôi tự hỏi thông tin nào khác tôi có thể thu thập để cung cấp cho họ, và nếu có bất kỳ cách nào để tránh ném này (có thể bằng cách tinh chỉnh thẻ ID3 trong mp3 này?)

+0

Tôi cũng nhận được ngoại lệ trong phương thức ExtAudioFileSetProperty của AudioToolbox. Tôi đã không tìm thấy một cách để tránh các trường hợp ngoại lệ, thật không may. –

+0

Vâng, có vẻ như họ chỉ đang sử dụng rất nhiều ngoại lệ trong nội bộ cho luồng kiểm soát. Giải pháp tốt nhất là không tự thêm tất cả ngoại lệ ném như một điểm ngắt, và thay vào đó sử dụng điểm ngắt "Điểm dừng ngoại lệ" của nó. – cbowns

+0

Có vẻ như là lỗi của Trình mô phỏng. Khi tôi chạy ứng dụng trên iPhone của tôi, nó sẽ không sụp đổ. – 0xa6a

Trả lời

3

Thư viện C++ có thể ném và bắt ngoại lệ cho tất cả các loại lý do, ví dụ như kết thúc bộ đệm hoặc kết thúc tập tin. Cho dù đây là một cách sử dụng thích hợp các ngoại lệ, phong cách mã hóa tốt hay thực hành kĩ nghệ phần mềm là gây tranh cãi. Miễn là một ngoại lệ không làm cho nó vô tình thành mã của bạn, bạn không nên lo lắng về nó.

Bạn nói rằng thường trình trả về thành công và kết quả mong muốn thu được, vì vậy không có gì sai (tức là nó không phải là lỗi).

+0

Đồng ý. Nói chung tôi đã ngừng thiết lập điểm ngắt "tất cả ngoại lệ", vì rất nhiều thư viện C++ sử dụng nó cho luồng điều khiển. – cbowns

6

Chúng tôi đã chạy vào một ngoại lệ trong cùng một vị trí, nó bật ra các tập tin mp3 nó đã xảy ra trên không có thẻ ID3 hợp lệ, chạy chúng thông qua một ứng dụng như Tagr cố định chúng lên.

+0

Tôi đã từ lâu ngừng làm việc trên dự án, nhưng đó là điều tuyệt vời để biết. Cảm ơn bạn về thông tin! – cbowns

+0

Đối với các lô nhỏ tệp âm thanh có thẻ không hợp lệ, hãy xem xét ứng dụng freemium OSX [Music Tag] (http://www.wideanglesoftware.com/musictag/) thay vì thanh toán cho Tagr. – AWrightIV

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