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

问题描述 投票:2回答:3

我遇到了问题,并尝试将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
    } //

有人可以帮帮我吗?

ios swift core-data try-catch xcode8
3个回答
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()
}

2
投票

使用Do-Catch处理错误您可以使用do-catch语句通过运行代码块来处理错误。如果do子句中的代码抛出错误,则会与catch子句进行匹配,以确定哪一个可以处理错误。

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

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

您必须写入最后一个默认的“catch”块,如“Switch Case”默认值:


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
  }
© www.soinside.com 2019 - 2024. All rights reserved.