2009-12-11 12 views
6

Stavo facendo un addPersistentStore piuttosto ordinario a un NSPersistentStoreCoordinator e ha generato un codice di errore &.NSLog, NSError, accesso errato

Così sono andato a NSLog esso, ed ha ottenuto un errore di accesso quando ho fatto questo:

NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

che sembra essere l'idioma comune.

Quando ho riformattato la dichiarazione errore come segue:

 NSLog(@"Unresolved error %@", [error userInfo]); 

... il problema è andato via.

Anche NSZombie non ha intercettato correttamente l'errore di accesso errato!

Qualche idea?

risposta

18

Come stai recuperando l'errore?

Il modo corretto, come described by bbum, è:

NSError *error; 
BOOL success = [blah blah:blah error:&error]; 
if (!success) { 
    NSLog(@"Error: %@ %@", error, [error userInfo]); //Or other error handling (e.g., [NSApp presentError:error]). 
} else { 
    //Succeeded—ignore the error variable entirely 
} 

(Questo è un metodo blah:error: che restituisce un BOOL, l'esempio nella bbum domanda ha risposto è stato per un metodo che ha restituito un oggetto The degli errori. lo schema di gestione è lo stesso per entrambi i casi)

Secondo i suoi aggiornamenti di Twitter poco dopo, some APIs will output an error object under the hood even if what you asked for succeeded, il che significa che testare la variabile di errore anziché il ritorno di BOOL può ingannare. Penso che questo sia quello che ti è successo.

La soluzione è solo esaminare l'oggetto errore se l'API segnala un errore.

1

Non dimenticare di inizializzare NSError con valore nullo

NSError* err = nil; 
[anObject doSomethingGetError:&err]; 
if (err) { 
    NSLog(...); 
} 

Se il problema persiste, è API bug

+1

Questo non aiuterà se l'API clobbers vostro 'initializer quelle negative con un invalido (o valido ma privo di significato) oggetto. Vedi la mia risposta e il tweet di @bbum che cita. –

+0

L'API non toccherà il riferimento "err" [che è nullo] se non ci sono errori. - (NSPersistentStore *) addPersistentStoreWithType: (NSString *) configurazione storeType: URL di configurazione (NSString *): (NSURL *) opzioni di storeURL: (NSDictionary *) errore di opzioni: errore (NSError **); Questo metodo di ritorno non è BOOL tipo – vaddieg

+0

In realtà, impostando l'oggetto err a zero indica solo che siete interessati ad esaminare l'oggetto Err se uno dovrebbe verificarsi. @Peter La risposta di Hosey mostra il modo corretto per determinare se una chiamata al metodo ha avuto successo o meno. –