【问题标题】:How to handle errors for functions returning a value如何处理返回值的函数的错误
【发布时间】:2020-03-01 11:21:56
【问题描述】:

我有一个函数在创建记录之前检查核心数据记录是否存在,并返回一个布尔值:如果存在则返回 true,如果不存在则返回 false。里面嵌套了一个 try, catch 语句。在这种有 return 语句的情况下,如何正确处理错误?目前,我有检查实现,但如果捕获被激活,则没有什么可以返回。我可以返回 true 以停止记录,但这不是“true”

func checkIfExists(id: String) -> Bool{
    let fetchRequest: NSFetchRequest<Conversions> = Conversions.fetchRequest()
    let predicate = NSPredicate(format: "id == %@", id)
    fetchRequest.predicate = predicate
    fetchRequest.fetchLimit = 1

    do {
        let count = try PersistenceService.context.count(for: fetchRequest)
        if (count == 0){
            return false
        } else {
            return true
        }
    }
    catch let error  {
        print("Could not fetch \(error)")
        return true // missing return in function
    }
}

【问题讨论】:

    标签: swift function error-handling


    【解决方案1】:

    如果您认为您的 checkIfExists 方法无法优雅地处理错误。这是一个很好的迹象,表明错误应该传播给调用者并在那里处理:

    func checkIfExists(id: String) throws -> Bool{
        let fetchRequest: NSFetchRequest<Conversions> = Conversions.fetchRequest()
        let predicate = NSPredicate(format: "id == %@", id)
        fetchRequest.predicate = predicate
        fetchRequest.fetchLimit = 1
        let count = try PersistenceService.context.count(for: fetchRequest)
        return count != 0
    }
    

    在调用者中,您可以do...catch错误,并希望(如果调用者需要返回一个值),即使发生错误,也可以返回一个有意义的值。

    如果调用者仍然不能返回一个有意义的值,你会再次向上传播错误,最终你会到达一个处理用户输入或其他东西(不返回值)的错误。在那里,您将向用户显示一条错误消息。


    根据您的设计,在发生错误时返回 false 也是一种选择 - 如果在访问 DB 文件时发生错误,则假设它不存在。

    【讨论】:

      猜你喜欢
      • 2021-07-31
      • 2014-01-07
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多