Swift:如果返回尝试失败,则执行catch

时间:2017-04-28 22:36:58

标签: swift return

我正在处理一段代码,它将从CoreData中获取NSManagedObject的数组。在我的代码中使用do catch语句时,这样做似乎不对,但这是我编写这行代码的最简单方法。

在使用return语句的任何其他情况下,您将跳出当前所处的函数。并且您可以放心,函数中没有其他代码会执行return之后的任何代码。声明。我想知道这同样适用于Swift的do catch范例。

class func getAll() -> [MMNotification] {
    let context = appDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<MMNotification>(entityName: "MMNotification")
    do {
        return try context.fetch(fetchRequest)
    }
    catch {
        // Will this 'catch' if the try fails, 
        // even if we said we are 'return'ing right before the 'try'?
        return []
    }
}

这里我将获取存储在CoreData中的通知列表。在do块中,您可以看到相关的代码行。

问题

如果catch在已经声明该函数应该try之后失败,那么return块是否会执行?

3 个答案:

答案 0 :(得分:2)

你所拥有的应该按预期工作。基本上发生的事情是如果在do中的任何时间发生抛出,则调用catch并且不会执行throw之后的任何代码。

答案 1 :(得分:1)

,如果z中的catch失败,则会执行try阻止。回报不会发生。

这里有一些代码可以证明这一点。将它粘贴到一个新的操场上进行试用。

return try

import UIKit let shouldFail = true enum DemoError:Error { case shouldFail } func failableGetter() throws -> String { if shouldFail { throw DemoError.shouldFail } return "Succeeded" } func fetchInfo() -> String { do { return try failableGetter() } catch { return "Failed" } } print(fetchInfo()) // "Failed" or "Succeeded" depending on shouldFail shouldFail时,true会引发错误,failableGetter()中的do-catch会在返回之前跳到catch部分。

fetchInfo()shouldFail时,false不会失败,failableGetter()会返回结果。

答案 2 :(得分:0)

添加到this answer。范围在这里有点重要。抛出之后,do块代码内的代码将不会执行。但是,将执行do块范围之外的代码。我做了一个简单的游乐场,你可以自己去看看。

import Foundation

let error = NSError(domain: "", code: 123, userInfo: [NSLocalizedDescriptionKey: "My error"])

func functionThatAlwaysThrows() throws {
    throw(error)
}

func myFunction() {
    do {
        try functionThatAlwaysThrows()

        // This will never print
        print("Continuing after throw inside do scope")
    } catch let err {
        print("Caught Error: \(err.localizedDescription)")
    }

    // This will always print
    print("Continuing after throw outside do scope")
}

输出:

Caught Error: My error
Continuing after throw outside do scope

如果您想了解有关错误处理的更多信息,可以查看the docs