何时在 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

最新更新