2015-07-17 5 views
1

У меня есть следующий код, который использует замыкание лениво инициализировать свойство:Swift 2: Ловля ошибок в затворе

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 

}() 

Код, как написано производит ошибку:

Call can throw, but it is not marked with 'try' and the error is not handled

Код помечен как «try», и ошибка обрабатывается. Когда я перемещаю замыкание в отдельную функцию и называю ее здесь, все работает так, как ожидалось.

Есть ли что-то о закрытии и делать/пытаться/поймать, что я не понимаю, или я столкнулся (еще одна!) Ошибка в замечательном компиляторе Swift 2?

ответ

2

Проблема заключается в том, что ваш улов не улавливает все возможные исключения, поэтому закрытие все еще может забрасываться. Использовать общий улов:

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 
}() 
+0

Действительно. Спасибо за разъяснения. –

+1

Любая идея, почему моя локальная версия метода сработала? –

+0

Вы правы. Локальная версия метода успешно завершена. Извините, я не могу объяснить разное поведение. Возможно, стоит радар. –

Смежные вопросы