AVAudioEngine 连接 - 代码退出函数而不会抛出错误

AVAudioEngine connect - code exiting function without throwing error

这可能是我不了解swift但我很困惑..

我有以下(简化的)代码 - 请注意,我已经从中提取了很多内容,因为它(通常)按预期运行:

engine = AVAudioEngine() //engine being a class variable

AVAudioUnit.instantiate(with: mixerDesc, options: [.loadOutOfProcess], completionHandler: {(audioUnit, auError) in
    //configure matrix mixer
    self.matrixMixer = au
    engine.attach(au)

    print("make connections")
    engine.connect(engine.inputNode, to: au, format: inputFormat)
    engine.connect(au, to: engine.mainMixerNode, format: inputFormat)
    print("connections done")

    try! engine.start()
} 

此代码在 99% 的情况下都有效,但是在某些情况下(主要是当默认 input/output 设备更改时)在建立连接时会生成错误。我不明白的是这个错误导致函数在错误发生时退出(当建立连接时),但不会导致应用程序终止 - 我假设这是因为错误是只是杀死那个线程。

有什么办法可以捕捉到这个错误吗?我试过在函数的开头添加一个 defer {} ,但这也没有被调用。这令人沮丧,因为这意味着应用程序不同步,我不清楚如何捕捉它。

仅供参考,抛出的错误是:

2020-05-31 22:33:22.219189+0100 StageSound[20887:289670] [General] required condition is false: IsFormatSampleRateAndChannelCountValid(hwFormat)
2020-05-31 22:33:22.221812+0100 StageSound[20887:289670] [General] (
    0   CoreFoundation                      0x00007fff332f1be7 __exceptionPreprocess + 250
    1   libobjc.A.dylib                     0x00007fff6c0c95bf objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff3331ad98

崩溃日志继续..

Objective-C 代码似乎抛出了 NSException。 您不能直接从 Swift 捕获 NSExceptions,但有一种方法可以在 Objective-C 和 Swift 之间创建一个桥梁。这样你就可以将 NSException 转换成 Swift 可以理解的东西(例如 NSError)。

有关此桥接的详细信息,请查看: