假设我们有一个应用程序,我们即将提交到应用程序商店......但它包含以下代码:
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>
或者我应该“优雅地处理错误?”当我不知道潜在的错误“抛出”是什么时,我怎么能这样做,更重要的是它背后的潜在原因。
感谢您的任何建议。 :)
答案 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
并允许调用堆栈中的其他函数抛出,直到您到达可以轻松的位置报告错误。如果达到这一点,请确保中间投掷功能能够使用defer
和catch
块清除其状态。
答案 2 :(得分:1)
如果您确定永远不会发生错误,可以强制尝试
try! audioSession.setCategory(AVAudioSessionCategoryAmbient)
try! audioSession.setActive(true)