代码之家  ›  专栏  ›  技术社区  ›  Nerdy Bunz

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

  •  0
  • Nerdy Bunz  · 技术社区  · 7 年前

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

        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 singleton实例的类别时遇到错误……但此错误的原因超出了此应用的控制范围。请按“确定”以关闭应用。这在应用测试期间从未发生过……因此我不知道为什么现在发生在你身上……一定与你的设备有关。可能重新启动?祝你下次好运。”

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

    感谢您的建议。:)

    3 回复  |  直到 7 年前
        1
  •  1
  •   JeremyP    7 年前

    我认为你可以采取两种策略。

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

      try! audioSession.setCategory(AVAudioSessionCategoryAmbient)
      

      do 
      {
          try audioSession.setCategory(AVAudioSessionCategoryAmbient)
      }
      catch
      {
           fatalError("setCategory failed with error: \(error)")
      }
      
    • 假设可能有一些当地原因导致它不起作用。在这种情况下,请使用 do ... catch 捕获错误并将其报告给用户。在调用 audioSession.setCategory ,您可以选择允许它 throw 并允许调用堆栈中的其他函数抛出,直到可以轻松报告错误为止。如果达到这一点,请确保中间抛出函数能够通过使用 defer catch 阻碍。

        2
  •  1
  •   Milan Nosáľ    7 年前

    如果出现这种情况的可能性很小,即使你没有适当的方法来处理它(假设应用程序是基于该功能构建的,如果它不工作,那么应用程序就变得无用了)——即使如此,我还是建议你在那里放一些好的处理代码——我相信这比让应用程序崩溃要好。

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

    如果应用程序崩溃,我会认为开发人员犯了一些错误。如果弹出窗口试图至少广泛地解释在获取音频会话时存在一些问题,那么我至少知道开发人员试图对此采取一些措施。

    基本上,虽然您无法从错误中恢复, 您至少可以对用户体验做些什么 .

        3
  •  1
  •   iDeveloper    7 年前

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

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