swift - 什么时候在 Swift 错误处理中使用异常和可选值?

标签 swift error-handling

我试图更好地理解 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/

相关文章:

objective-c - 如何像 Pages app 那样实现 "New Document"窗口?

ios - 将 Firebase 登录转移到今天的扩展

ios - afterScreenUpdates : true 时 drawHierarchy 失败

r - 如何自定义发送到控制台的错误消息?

python - "OSError: telling position disabled by next() call"如何解决

swift - 未调用完成处理程序 - Alamofire/stripe

ios - Swift 2 从 View Controller 返回选项卡栏 Controller 中的选定选项卡

node.js - Nodejs调试-自动生成错误信息

ruby - 如果条件在ruby中, “rescue false”是什么意思

error-handling - 为什么WSO2 ESB错误代码不针对不同的情况