我试图更好地理解 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
关于swift - 什么时候在 Swift 错误处理中使用异常和可选值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57647303/