首页 > 解决方案 > 何时在 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 对象。但我主要使用这个默认初始化程序来指示出现问题,这感觉很糟糕。另外,我觉得在失败的原因可能有很多不同的情况下,我过度使用选项来进行错误处理。

什么时候使用可选项来指示错误以及何时使用异常的试金石是什么?

标签: swifterror-handling

解决方案


只要有错误的详细信息,您就应该抛出错误,并且可以以某种方式使用它们来恢复错误。

例如,由于路径不正确、权限错误或文件类型错误(例如文件夹),打开文件系统上的文件可能会失败。抛出的错误可能包含此信息,但它不会真正有帮助,因为您的应用程序无法使用该信息从错误中恢复。

在你的情况下,我认为可选是一个不错的选择。但是,您不应该重复自己:

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

推荐阅读