swift - 何时在 Swift 错误处理中使用异常和可选项?
问题描述
我试图更好地理解 Swift 错误处理,但我在网上找不到这个问题的具体答案。我有一个应用程序大量使用选项来进行错误处理。例如,这是我的应用程序中的一段代码:
if let winnerName = gameApiResponse.winner {
guard let gameFromApi = GameFromApi(id: gameApiResponse.id, contestantsNames: gameApiResponse.contestants, winnerName: winnerName, confidence: 50, conferencesNames: conferenceNamesInGame, week: gameApiResponse.week) else {
os_log("Could not unwrap new game object in loadGames(gameApiResponses:) in DataModelManager", type: .debug)
return GameFromApi()
}
return gameFromApi
} else {
guard let gameFromApi = GameFromApi(id: gameApiResponse.id, contestantsNames: gameApiResponse.contestants, winnerName: nil, confidence: 50, conferencesNames: conferenceNamesInGame, week: gameApiResponse.week) else {
os_log("Could not unwrap new game object in loadGames(gameApiResponses:) in DataModelManager", type: .debug)
return GameFromApi()
}
return gameFromApi
}
GameFromApi 是一个类,它有一个可失败的初始化程序和一个默认的、不可失败的初始化程序(没有参数)。如果常规初始化程序失败,我将调用默认初始化程序,并仅将此函数返回一个具有默认值的“空白”GameFromApi 对象。但我主要使用这个默认初始化程序来指示出现问题,这感觉很糟糕。另外,我觉得在失败的原因可能有很多不同的情况下,我过度使用选项来进行错误处理。
什么时候使用可选项来指示错误以及何时使用异常的试金石是什么?
解决方案
只要有错误的详细信息,您就应该抛出错误,并且可以以某种方式使用它们来恢复错误。
例如,由于路径不正确、权限错误或文件类型错误(例如文件夹),打开文件系统上的文件可能会失败。抛出的错误可能包含此信息,但它不会真正有帮助,因为您的应用程序无法使用该信息从错误中恢复。
在你的情况下,我认为可选是一个不错的选择。但是,您不应该重复自己:
guard let gameFromApi = GameFromApi(
id: gameApiResponse.id,
contestantsNames: gameApiResponse.contestants,
winnerName: gameApiResponse.winner,
confidence: 50,
conferencesNames: conferenceNamesInGame,
week: gameApiResponse.week
) else {
os_log("Could not unwrap new game object in loadGames(gameApiResponses:) in DataModelManager", type: .debug)
return GameFromApi()
}
return gameFromApi
推荐阅读
- python - Python Datetime 重采样结果突然出现 NaN 值
- javascript - 如何递归循环遍历对象数组并使用javascript找到匹配id的索引并做出反应?
- android - 如何在最新的android studio版本中安装android support repository v23.3.0?
- python - 字符串连接-TypeError:一元+的错误操作数类型:'str'
- python - 函数调用的高效或混乱使用
- c++ - 使用 boost 编译时出现序列化错误
- c - 如何使用 pthread 从两个数组中查找公共值
- recursion - 打印出树中的所有节点时,递归还是迭代更有效?
- javascript - Javascript(浮点问题):有没有可靠的方法将分数转换为小数然后再返回?
- sql - Oracle SQL 在字符串的数字部分之后选择字符