【问题标题】:Swift 2: Catching errors in a closureSwift 2:在闭包中捕获错误
【发布时间】:2015-10-06 18:36:18
【问题描述】:

我有以下代码,它使用闭包来延迟初始化属性:

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    do {
        try coordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil)
    } catch let err as NSError {
        XCTFail("error creating store: \(err)")
    }
    return coordinator

}()

编写的代码会产生错误:

调用可以抛出,但是没有标记'try'并且错误没有处理

代码用“try”标记,错误得到处理。当我将闭包移动到一个单独的函数中并在此处调用它时,一切都按预期工作。

关于闭包和 do/try/catch 是否有我不理解的地方,或者我在出色的 Swift 2 编译器中遇到了(又一个!)错误?

【问题讨论】:

    标签: swift closures try-catch


    【解决方案1】:

    问题是你的catch没有捕捉到所有可能的异常,所以闭包仍然可以抛出。使用通用的 catch:

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
        let coordinator = NSPersistentStoreCoordinator(managedObjectModel:  self.managedObjectModel)
        do {
            try coordinator.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil)
        } catch {
            XCTFail("error creating store: \(error)")
        }
        return coordinator
    }()
    

    【讨论】:

    • 确实如此。感谢您的澄清。
    • 知道为什么我的本地方法版本成功了吗?
    • 你是对的。本地方法版本成功。抱歉,我无法解释不同的行为。可能值得一试。
    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多