Почему AudioServicesCreateSystemSoundID создает внутреннее исключение, но возвращает 0 в качестве кода ошибки?

Я запускаю программу iOS в симуляторах 4.3.2, 5.0 и 5.1 и сталкиваюсь со странным внутренним исключением в AudioToolbox. У меня есть точка останова, установленная в Xcode (Xcode 4.3.1, работающая на 10.7.3) для всех исключений, и отладчик ломается во время вызова AudioServicesCreateSystemSoundID():

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

Обратный след:

(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

Однако аудиофайл в soundID создан успешно, а код ошибки OSStatus, который возвращает AudioServicesCreateSystemSoundID, равен 0.

Это происходит во всех трех версиях iOS Simulator, которые я установил, и на моем iPhone с версией 5.1.

Это похоже на ту же общую обратную трассировку, что и AVAudioPlayer выдает точку останова в режиме отладки , хотя мой результат более прямого вызова AudioToolbox.

Я хочу отправить это в Apple, так как это ошибка в AudioToolbox (фреймворки не должны использовать исключения для управления потоком, для каждого bbum и других), но прежде чем я это сделаю, мне интересно, какую еще информацию я могу собрать, чтобы предоставить им, и есть ли способ избежать этого броска (может быть, подправив теги ID3 в этом mp3?)


person cbowns    schedule 21.03.2012    source источник
comment
Я также получаю исключение в методе ExtAudioFileSetProperty AudioToolbox. К сожалению, я не нашел способа избежать исключений.   -  person Simone Manganelli    schedule 21.03.2012
comment
Да, похоже, они просто используют кучу исключений внутри для управления потоком. Лучшее решение — не добавлять вручную все броски исключений в качестве точки останова, а вместо этого использовать точку останова «Exception Breakpoint».   -  person cbowns    schedule 07.05.2012
comment
Похоже, это баг Симулятора. Когда я запускаю приложение на своем iPhone, оно не вылетает.   -  person Benjamin Wen    schedule 12.03.2016


Ответы (2)


Библиотеки C++ могут генерировать и перехватывать внутренние исключения по разным причинам, например конец буфера или конец файла. Является ли это подходящим использованием исключений, хорошим стилем кодирования или практикой разработки программного обеспечения, остается спорным. Пока исключение не делает его незахваченным в вашем коде, вам не о чем беспокоиться.

Вы говорите, что подпрограмма успешно завершается и получается желаемый результат, так что все в порядке (т. е. это не ошибка).

person idz    schedule 02.07.2012
comment
Согласованный. Обычно я перестал устанавливать точку останова для всех исключений, так как очень многие библиотеки C++ используют ее для управления потоком. - person cbowns; 13.03.2016

Мы столкнулись с исключением в том же месте, оказалось, что mp3-файлы, в которых оно происходило, не имели действительных тегов ID3, запуская их через приложение, такое как Tagr исправил их.

person yo.ian.g    schedule 27.02.2013
comment
Я давно перестал работать над проектом, но это здорово знать. Спасибо за информацию! - person cbowns; 07.11.2013
comment
Для небольших пакетов аудиофайлов с недопустимыми тегами рассмотрите бесплатное приложение OSX Музыкальный тег вместо того, чтобы платить за Тагр. - person AWrightIV; 03.01.2015