在将应用程序提交到应用商店之前,如何处理潜在错误“抛出”?

时间:2018-01-18 10:09:46

标签: ios swift app-store avaudiosession throws

假设我们有一个应用程序,我们即将提交到应用程序商店......但它包含以下代码:

    try? audioSession.setCategory(AVAudioSessionCategoryAmbient)
        if error != nil {
        // this should never happen
        }

    try? audioSession.setActive(true)
        if error != nil {
        // this should never happen
        }

我们必须“尝试”setCategory方法,因为它“抛出”...但我不知道它为什么会抛出/失败。

我觉得这会被视为垃圾代码...而且我应该做的不仅仅是说“这应该永远不会发生”,但如果确实发生错误,我不知道该如何处理它

This文档没有说明为什么会出现错误的原因。

我是否应该制作一个弹出窗口,上面写着“抱歉......我们在尝试在audioSession单例实例上设置类别时遇到错误...但是此错误的原因超出了此应用程序的控制范围。按确定以便应用程序可以关闭。这在应用程序测试期间从未发生过...所以我不知道为什么它现在发生在您身上...必须与您的设备有关。也许重启?下次好运。“< / p>

或者我应该“优雅地处理错误?”当我不知道潜在的错误“抛出”是什么时,我怎么能这样做,更重要的是它背后的潜在原因。

感谢您的任何建议。 :)

3 个答案:

答案 0 :(得分:1)

如果甚至有可能发生这种情况,即使你没有正确的方法来处理它(让我们说应用程序是基于该功能构建的,如果它不起作用,那么应用程序就变得无用了) - 即便如此,我还是会建议使用一些不错的处理代码 - 我认为它比让应用程序崩溃更好。

我可能会要求用户向您报告这些设置的详细信息(毕竟,错误本身至少应包含一条消息,可能会提示您出现了什么问题)。

如果应用程序崩溃,我会假设开发人员犯了一些错误。如果弹出窗口试图至少广泛地解释获得音频会话时遇到一些问题,我至少会知道开发人员试图对此做些什么。

基本上,虽然您无法对从错误中恢复做任何事情,您至少可以做一些关于用户体验的事情

答案 1 :(得分:1)

我看到你可以采用两种策略。

  • 假设抛出错误的唯一方法是传入无效的类别字符串。由于您的字符串被硬编码为提供的常量之一,因此您可以假设这种情况永远不会发生。在这种情况下,如果try抛出则导致致命错误。 e.g。

    try! audioSession.setCategory(AVAudioSessionCategoryAmbient)
    

    do 
    {
        try audioSession.setCategory(AVAudioSessionCategoryAmbient)
    }
    catch
    {
         fatalError("setCategory failed with error: \(error)")
    }
    
  • 假设可能存在某些原因导致其无效。在这种情况下,使用do ... catch来捕获错误并将其报告给用户。这不一定发生在调用audioSession.setCategory的函数中,您可以选择允许它throw并允许调用堆栈中的其他函数抛出,直到您到达可以轻松的位置报告错误。如果达到这一点,请确保中间投掷功能能够使用defercatch块清除其状态。

答案 2 :(得分:1)

如果您确定永远不会发生错误,可以强制尝试

try! audioSession.setCategory(AVAudioSessionCategoryAmbient)
try! audioSession.setActive(true)