Swift 3中的错误处理:尝试,尝试?和尝试!

某些人可能已经熟悉使用关键字try来处理Swift中的错误。 对于那些不知道try是什么的人, try只是一种处理任何给定函数中可能出现的错误的方法。 通常,我们具有“抛出”功能,这意味着它们具有抛出错误的能力,而try是一个简洁的关键字,它使我们能够处理那些错误的可能性。

在构建我们的应用程序时,可以使用三种try形式。

 尝试 
尝试?
尝试!

如果您对这些变体感到恐惧,那就不要! 而且,如果您不确定要使用哪一个,请不要担心,我已为您覆盖。

正如我之前提到的, try通常与throw函数结合使用,因此我们将讨论一下throw函数,并在实际中使用try关键字。

假设我们正在尝试通过一些JSON进行解析,以便可以将这些数据带入我们的应用程序。 此数据可能由于互联网中断而无法到达我们的应用程序,或者您尝试提取的数据不再存在! 这些都是在我们尝试从API检索数据时可能出现错误的情况。 但是Swift的JSONSerialization方法具有内置函数,默认情况下throws 。 Swift知道我们检索数据的尝试可能会带来一些错误,并创建了一个函数,该函数使我们能够在发生错误的情况下解决该情况。

使用try ,我们的throw函数必须包装在do-catch语句中。 这使我们能够自定义错误处理并根据错误执行特定的操作。

下面我们将使用try来优雅地捕获任何错误。

 做{ 
让responseJSON =试试JSONSerialization.jsonObject(with:data,options:[])as! [[String:Any]]
 完成(responseJSON) 
  } { 
 打印(“嗯,这里出了点问题。请尝试连接到wifi。”) 
  } 

作为开发人员,将try与do-catch语句一起使用可使我们检查有意义的错误,以样式处理它们,并避免用户感到沮丧。 考虑一下,我们是否真的希望我们的应用程序在用户没有任何互联网连接时崩溃,还是我们要让他们知道该应用程序一旦连接到wifi就会继续运行? 在这种情况下,通知会更有帮助,而我们的do-catch语句使我们可以做到这一点。

另一方面,我们也可以使用try?处理错误try? 。 如果您有使用可选控件的任何经验,那么您很快就会意识到该try? 就是这样。 try? 让我们忽略我们的错误,并在我们的函数将其抛出时让它们变为nil。 因此,我们不必将代码包装在do-catch语句中。 但是,如果要分配try?我们是否必须解开变量try? 有价值。

 让responseJSON =试试吗?  JSONSerialization.jsonObject(with:data,options:[])as!  [[String:Any]] 
 如果让responseJSON = responseJSON { 
print(“是的!我们刚刚包装了responseJSON!”
}

上面的代码为responseJSON分配了一个可选值,并在调用的函数引发任何错误时将其设置为nil。 使用try? 当可能引发的错误不重要时,此方法很有用,并且我们希望避免为引发的错误分配任何操作。

由于我们的responseJSON将是可选的,因此我们可以将保护语句集成到我们的代码中,并以可读的方式对其进行包装。

 守卫让responseJSON =试试?  JSONSerialization.jsonObject(with:data,options:[])as!  [[String:Any]] else {return} 

最后,我们try! ,其作用类似于强制展开的可选。 这种变体基本上可以断言,尽管该函数具有抛出错误的能力,但是由于我们试图接收的信息可以保证存在,所以这种情况永远不会发生。 换句话说, try! 当我们知道我们的方法不可能失败的时候使用,或者如果这行代码是如此基础,以至于如果实际上存在错误,那么整个应用程序也可能崩溃。

 让responseJSON =试试!  JSONSerialization.jsonObject(with:data,options:[])as!  [[String:Any]] 

像所有强制展开的值一样, try! 应该小心使用。