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() {
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))
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.
*/
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.
*/
case ProgressiveMigrationRequired(storage: LocalStorage)
case ProgressiveMigrationRequired(localStoreURL: NSURL)
/**
An internal SDK call failed with the specified `NSError`.
@@ -87,7 +87,7 @@ public enum CoreStoreError: ErrorType, CustomStringConvertible, CustomDebugStrin
public var description: String {
// TODO:
return (self as NSError).description
return self.objc.description
}
@@ -198,7 +198,11 @@ internal extension ErrorType {
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 {
return .InternalError(NSError: error)
@@ -223,22 +227,20 @@ internal extension ErrorType {
return .DifferentStorageExistsAtURL(existingPersistentStoreURL: existingPersistentStoreURL)
case .MappingModelNotFound:
guard let persistentStore = info["persistentStore"] as? NSPersistentStore,
let storage = persistentStore.storageInterface as? LocalStorage,
guard let localStoreURL = info["localStoreURL"] as? NSURL,
let targetModel = info["targetModel"] as? NSManagedObjectModel,
let targetModelVersion = info["targetModelVersion"] as? String else {
return .Unknown
}
return .MappingModelNotFound(storage: storage, targetModel: targetModel, targetModelVersion: targetModelVersion)
return .MappingModelNotFound(localStoreURL: localStoreURL, targetModel: targetModel, targetModelVersion: targetModelVersion)
case .ProgressiveMigrationRequired:
guard let persistentStore = info["persistentStore"] as? NSPersistentStore,
let storage = persistentStore.storageInterface as? LocalStorage else {
guard let localStoreURL = info["localStoreURL"] as? NSURL else {
return .Unknown
}
return .ProgressiveMigrationRequired(storage: storage)
return .ProgressiveMigrationRequired(localStoreURL: localStoreURL)
case .InternalError:
guard case let NSError as NSError = info["NSError"] else {
@@ -246,26 +248,25 @@ internal extension ErrorType {
return .Unknown
}
return .InternalError(NSError: NSError)
default:
return .Unknown
}
}
internal var objc: NSError {
let domain = "com.corestore.error"
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 info: [NSObject: AnyObject]
switch error {
case .Unknown:
return self as NSError
code = .Unknown
info = [:]
case .DifferentStorageExistsAtURL(let existingPersistentStoreURL):
code = .DifferentStorageExistsAtURL
@@ -273,31 +274,25 @@ internal extension ErrorType {
"existingPersistentStoreURL": existingPersistentStoreURL
]
case .MappingModelNotFound(let storage, let targetModel, let targetModelVersion):
case .MappingModelNotFound(let localStoreURL, let targetModel, let targetModelVersion):
code = .MappingModelNotFound
info = [
"storage": storage.objc,
"localStoreURL": localStoreURL,
"targetModel": targetModel,
"targetModelVersion": targetModelVersion
]
case .ProgressiveMigrationRequired:
guard let persistentStore = info["persistentStore"] as? NSPersistentStore,
let storage = persistentStore.storageInterface as? LocalStorage else {
return .Unknown
}
return .ProgressiveMigrationRequired(storage: storage)
case .ProgressiveMigrationRequired(let localStoreURL):
code = .ProgressiveMigrationRequired
info = [
"localStoreURL": localStoreURL
]
case .InternalError:
guard case let NSError as NSError = info["NSError"] else {
return .Unknown
}
return .InternalError(NSError: NSError)
default:
return self as NSError
case .InternalError(let NSError):
code = .InternalError
info = [
"NSError": NSError
]
}
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 {
let error = CoreStoreError.MappingModelNotFound(
storage: storage,
localStoreURL: fileURL,
targetModel: self.model,
targetModelVersion: self.modelVersion
)
@@ -358,7 +358,7 @@ public extension DataStack {
if migrationSteps.count > 1 && storage.localStorageOptions.contains(.PreventProgressiveMigration) {
let error = CoreStoreError.ProgressiveMigrationRequired(storage: storage)
let error = CoreStoreError.ProgressiveMigrationRequired(localStoreURL: fileURL)
CoreStore.log(
error,
"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 {
let error = CoreStoreError.MappingModelNotFound(
storage: storage,
localStoreURL: storage.fileURL,
targetModel: self.model,
targetModelVersion: self.modelVersion
)
@@ -421,7 +421,7 @@ public extension DataStack {
}
else if numberOfMigrations > 1 && storage.localStorageOptions.contains(.PreventProgressiveMigration) {
let error = CoreStoreError.ProgressiveMigrationRequired(storage: storage)
let error = CoreStoreError.ProgressiveMigrationRequired(localStoreURL: storage.fileURL)
CoreStore.log(
error,
"Failed to find migration mapping from the \(typeName(storage)) at URL \"\(storage.fileURL)\" to version model \"\(self.modelVersion)\" without requiring progessive migrations."