从这里抛出的错误不会被处理,因为封闭的catch在context.save中并不详尽

时间:2017-05-18 19:26:39

标签: ios swift core-data try-catch xcode8

我遇到问题并尝试将xcode更新到版本8.3.2。代码正在运行,但在更新之后不再了。它符合以下代码:

func saveContext() -> NSError?{// It saving
        do {
            if  context == context {
                try context.save()
           // taskNameTextField.text=nil
            }
        } catch let error as! NSError? {
            print("error saving core data: \(error)")
            return error
        }
        return nil
    } //

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

事实证明,当从Swift 2更新到Swift 3时,Apple转换器无法捕获代码中的所有问题。您需要自己更新一些内容。它没有捕获的一件事是对NSError的所有引用。它错过了几个需要将NSError转换为Error的地方。

func saveContext() -> Error?{ // remove the `NS` from Error here.
    do {
        if  context == context { // this is always true, remove it.
            try context.save()
        }
    } catch { // remove the `let error as! NSError?` from here
        print("error saving core data: \(error)")
        return error
    }
    return nil
}

此功能的简单版本是:

func saveContext() -> Error? {
    do {
        try context.save()
        return nil
    } catch {
        return error
    }
}

或实施catch一级,然后变为:

func saveContext() throws {
    try context.save()
}

答案 1 :(得分:2)

使用批量捕获处理错误 您可以使用do-catch语句通过运行代码块来处理错误。如果do子句中的代码引发错误,则将其与catch子句进行匹配,以确定其中哪一个可以处理该错误。

这是do-catch语句的一般形式:

do {
    try expression
   // statements
} catch pattern 1 {
   // statements
} catch pattern 2 where condition {
   //statements
} catch {
  // statements
}

您必须编写与“ Switch_case”默认值相同的最后一个默认“ catch” Blok:

答案 2 :(得分:0)

这是Swift 4.2中的解决方案

 func saveContext() -> NSError? {
    do {
        try managedContext.save()
    } catch let error as NSError {
      print("error saving core data: \(error) \(error.description)")
      return error
    }
    return nil
  }