WIP: error handling

This commit is contained in:
John Rommel Estropia
2016-03-22 22:51:42 +09:00
parent e8a9cc9d67
commit 24008d62b2
3 changed files with 33 additions and 42 deletions

View File

@@ -44,10 +44,6 @@ class CoreStoreTests: XCTestCase {
func testExample() { func testExample() {
let err = CoreStoreError.DifferentStorageExistsAtURL(existingPersistentStoreURL: NSURL(string: "http://google.com")!)
let err1 = err as NSError
let err2 = err1 as! CoreStoreError
let stack = DataStack(modelName: "Model", bundle: NSBundle(forClass: self.dynamicType)) let stack = DataStack(modelName: "Model", bundle: NSBundle(forClass: self.dynamicType))
CoreStore.defaultStack = stack CoreStore.defaultStack = stack
XCTAssert(CoreStore.defaultStack === stack, "CoreStore.defaultStack === stack") XCTAssert(CoreStore.defaultStack === stack, "CoreStore.defaultStack === stack")

View File

@@ -44,12 +44,12 @@ public enum CoreStoreError: ErrorType, CustomStringConvertible, CustomDebugStrin
/** /**
An `NSMappingModel` could not be found for a specific source and destination model versions. An `NSMappingModel` could not be found for a specific source and destination model versions.
*/ */
case MappingModelNotFound(storage: LocalStorage, targetModel: NSManagedObjectModel, targetModelVersion: String) case MappingModelNotFound(localStoreURL: NSURL, targetModel: NSManagedObjectModel, targetModelVersion: String)
/** /**
Progressive migrations are disabled for a store, but an `NSMappingModel` could not be found for a specific source and destination model versions. Progressive migrations are disabled for a store, but an `NSMappingModel` could not be found for a specific source and destination model versions.
*/ */
case ProgressiveMigrationRequired(storage: LocalStorage) case ProgressiveMigrationRequired(localStoreURL: NSURL)
/** /**
An internal SDK call failed with the specified `NSError`. An internal SDK call failed with the specified `NSError`.
@@ -87,7 +87,7 @@ public enum CoreStoreError: ErrorType, CustomStringConvertible, CustomDebugStrin
public var description: String { public var description: String {
// TODO: // TODO:
return (self as NSError).description return self.objc.description
} }
@@ -198,7 +198,11 @@ internal extension ErrorType {
return error return error
} }
let error = self as NSError guard let error = (self as Any) as? NSError else {
return .Unknown
}
guard error.domain == "com.corestore.error" else { guard error.domain == "com.corestore.error" else {
return .InternalError(NSError: error) return .InternalError(NSError: error)
@@ -223,22 +227,20 @@ internal extension ErrorType {
return .DifferentStorageExistsAtURL(existingPersistentStoreURL: existingPersistentStoreURL) return .DifferentStorageExistsAtURL(existingPersistentStoreURL: existingPersistentStoreURL)
case .MappingModelNotFound: case .MappingModelNotFound:
guard let persistentStore = info["persistentStore"] as? NSPersistentStore, guard let localStoreURL = info["localStoreURL"] as? NSURL,
let storage = persistentStore.storageInterface as? LocalStorage,
let targetModel = info["targetModel"] as? NSManagedObjectModel, let targetModel = info["targetModel"] as? NSManagedObjectModel,
let targetModelVersion = info["targetModelVersion"] as? String else { let targetModelVersion = info["targetModelVersion"] as? String else {
return .Unknown return .Unknown
} }
return .MappingModelNotFound(storage: storage, targetModel: targetModel, targetModelVersion: targetModelVersion) return .MappingModelNotFound(localStoreURL: localStoreURL, targetModel: targetModel, targetModelVersion: targetModelVersion)
case .ProgressiveMigrationRequired: case .ProgressiveMigrationRequired:
guard let persistentStore = info["persistentStore"] as? NSPersistentStore, guard let localStoreURL = info["localStoreURL"] as? NSURL else {
let storage = persistentStore.storageInterface as? LocalStorage else {
return .Unknown return .Unknown
} }
return .ProgressiveMigrationRequired(storage: storage) return .ProgressiveMigrationRequired(localStoreURL: localStoreURL)
case .InternalError: case .InternalError:
guard case let NSError as NSError = info["NSError"] else { guard case let NSError as NSError = info["NSError"] else {
@@ -246,26 +248,25 @@ internal extension ErrorType {
return .Unknown return .Unknown
} }
return .InternalError(NSError: NSError) return .InternalError(NSError: NSError)
default:
return .Unknown
} }
} }
internal var objc: NSError { internal var objc: NSError {
let domain = "com.corestore.error"
guard let error = self as? CoreStoreError else { guard let error = self as? CoreStoreError else {
return self as NSError return ((self as Any) as? NSError)
?? NSError(domain: domain, code: CoreStoreError.Code.Unknown.rawValue, userInfo: [:])
} }
let domain = "com.corestore.error"
let code: CoreStoreError.Code let code: CoreStoreError.Code
let info: [NSObject: AnyObject] let info: [NSObject: AnyObject]
switch error { switch error {
case .Unknown: case .Unknown:
return self as NSError code = .Unknown
info = [:]
case .DifferentStorageExistsAtURL(let existingPersistentStoreURL): case .DifferentStorageExistsAtURL(let existingPersistentStoreURL):
code = .DifferentStorageExistsAtURL code = .DifferentStorageExistsAtURL
@@ -273,31 +274,25 @@ internal extension ErrorType {
"existingPersistentStoreURL": existingPersistentStoreURL "existingPersistentStoreURL": existingPersistentStoreURL
] ]
case .MappingModelNotFound(let storage, let targetModel, let targetModelVersion): case .MappingModelNotFound(let localStoreURL, let targetModel, let targetModelVersion):
code = .MappingModelNotFound code = .MappingModelNotFound
info = [ info = [
"storage": storage.objc, "localStoreURL": localStoreURL,
"targetModel": targetModel, "targetModel": targetModel,
"targetModelVersion": targetModelVersion "targetModelVersion": targetModelVersion
] ]
case .ProgressiveMigrationRequired: case .ProgressiveMigrationRequired(let localStoreURL):
guard let persistentStore = info["persistentStore"] as? NSPersistentStore, code = .ProgressiveMigrationRequired
let storage = persistentStore.storageInterface as? LocalStorage else { info = [
"localStoreURL": localStoreURL
return .Unknown ]
}
return .ProgressiveMigrationRequired(storage: storage)
case .InternalError: case .InternalError(let NSError):
guard case let NSError as NSError = info["NSError"] else { code = .InternalError
info = [
return .Unknown "NSError": NSError
} ]
return .InternalError(NSError: NSError)
default:
return self as NSError
} }
return NSError(domain: domain, code: code.rawValue, userInfo: info) return NSError(domain: domain, code: code.rawValue, userInfo: info)

View File

@@ -345,7 +345,7 @@ public extension DataStack {
guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else { guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else {
let error = CoreStoreError.MappingModelNotFound( let error = CoreStoreError.MappingModelNotFound(
storage: storage, localStoreURL: fileURL,
targetModel: self.model, targetModel: self.model,
targetModelVersion: self.modelVersion targetModelVersion: self.modelVersion
) )
@@ -358,7 +358,7 @@ public extension DataStack {
if migrationSteps.count > 1 && storage.localStorageOptions.contains(.PreventProgressiveMigration) { if migrationSteps.count > 1 && storage.localStorageOptions.contains(.PreventProgressiveMigration) {
let error = CoreStoreError.ProgressiveMigrationRequired(storage: storage) let error = CoreStoreError.ProgressiveMigrationRequired(localStoreURL: fileURL)
CoreStore.log( CoreStore.log(
error, error,
"Failed to find migration mapping from the \(typeName(storage)) at URL \"\(fileURL)\" to version model \"\(self.modelVersion)\" without requiring progessive migrations." "Failed to find migration mapping from the \(typeName(storage)) at URL \"\(fileURL)\" to version model \"\(self.modelVersion)\" without requiring progessive migrations."
@@ -393,7 +393,7 @@ public extension DataStack {
guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else { guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else {
let error = CoreStoreError.MappingModelNotFound( let error = CoreStoreError.MappingModelNotFound(
storage: storage, localStoreURL: storage.fileURL,
targetModel: self.model, targetModel: self.model,
targetModelVersion: self.modelVersion targetModelVersion: self.modelVersion
) )
@@ -421,7 +421,7 @@ public extension DataStack {
} }
else if numberOfMigrations > 1 && storage.localStorageOptions.contains(.PreventProgressiveMigration) { else if numberOfMigrations > 1 && storage.localStorageOptions.contains(.PreventProgressiveMigration) {
let error = CoreStoreError.ProgressiveMigrationRequired(storage: storage) let error = CoreStoreError.ProgressiveMigrationRequired(localStoreURL: storage.fileURL)
CoreStore.log( CoreStore.log(
error, error,
"Failed to find migration mapping from the \(typeName(storage)) at URL \"\(storage.fileURL)\" to version model \"\(self.modelVersion)\" without requiring progessive migrations." "Failed to find migration mapping from the \(typeName(storage)) at URL \"\(storage.fileURL)\" to version model \"\(self.modelVersion)\" without requiring progessive migrations."