NSError: Est-ce que l'aide nil pour détecter l'erreur désactiver réellement les rapports d'erreurs?

StackOverflow https://stackoverflow.com/questions/4719040

  •  12-10-2019
  •  | 
  •  

Question

Je suis entré dans l'habitude de coder mon erreur de manipulation de cette façon:

 NSError* error = nil;
 NSDictionary *attribs = [[NSFileManager defaultManager] removeItemAtPath:fullPath error:&error];
 if (error != nil) {
  DLogErr(@"Unable to remove file: error %@, %@", error, [error userInfo]);
  return; 
 }  

Mais en regardant la documentation Il semble que je suis arrivé ce mal.

- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error
  

Si une erreur se produit, lors du retour contient un objet NSError qui décrit le problème. Passez NULL si vous ne voulez pas d'informations d'erreur.

Techniquement il n'y a pas de différence entre zéro et NULL ne signifie donc ce que je deviens effectivement ce hors et ne sera jamais un message d'erreur (même si la suppression dans l'exemple ci-dessus omettait)? Y at-il une meilleure façon de coder cela?

Merci.

Était-ce utile?

La solution

Tout d'abord, la ligne suivante ne fait pas vraiment de sens:

NSDictionary *attribs = [[NSFileManager defaultManager]
 removeItemAtPath:fullPath error:&error];

-removeItemAtPath:error: retourne une valeur booléenne, pas un dictionnaire.

Je crois que je vois ce que vous vous interrogez sur la valeur NULL. Notez bien que, comment il y a 2 * 's dans le paramètre d'erreur dans la signature de la méthode:

- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error

Cela signifie un pointeur vers un pointeur. Lorsque vous passez &error, vous passez à l'adresse du pointeur sur le NSError. (Ugh, quelqu'un d'autre peut probablement me aider, comme ma tête commence encore à nager lorsqu'ils traitent avec des pointeurs sur des pointeurs). En d'autres termes, même si vous avez défini error à nil, vous n'êtes pas de passage dans error à la méthode, vous passez dans &error.

Alors, voici ce que la méthode réécrite devrait ressembler à:

// If you want error detection:
NSError *error = nil;
if (![[NSFileManager defaultManager] removeItemAtPath:fullPath
            error:&error]) {
    NSLog(@"failed to remove item at path; error == %@", error);
    // no need to log userInfo separately
    return;
}

// If you don't:
if (![[NSFileManager defaultManager] removeItemAtPath:fullPath
            error:NULL]) {
    NSLog(@"failed to remove item at path");
    return;
}

Autres conseils

Passing moyens de NULL ce qui suit:

BOOL itemRemoved = [[NSFileManager defaultManager] removeItemAtPath:fullPath
    error:NULL];

i.e.., Le paramètre error est NULL. En interne, -removeItemAtPath:error: voit si un pointeur valide a été adoptée. Si elle est NULL, il suffit de ne signaler l'erreur comme une instance de NSError - mais la valeur de retour indique si la méthode complété avec succès

.

En outre, votre test est erroné. Vous ne devriez pas utiliser le paramètre de sortie de error pour détecter si une erreur est survenue car il pourrait être réglé même si la méthode se termine normalement . , Vous devriez utiliser la valeur de retour de la méthode pour détecter les erreurs. Si la valeur de retour (dans ce cas particulier) est NO, utilisez le paramètre de sortie error pour obtenir des informations sur l'erreur:

NSError *error = nil;
BOOL itemRemoved = [[NSFileManager defaultManager] removeItemAtPath:fullPath error:&error];
if (itemRemoved == NO) {
    DLogErr(@"Unable to remove file: error %@, %@", error, [error userInfo]);
    return; 
}

Gestion des erreurs Guide de programmation

  

Important: Le succès ou l'échec est indiquée par la valeur de retour de la méthode. Bien que les méthodes de cacao qui renvoient indirectement des objets d'erreur dans le domaine d'erreur Cocoa sont garantis pour renvoyer ces objets si la méthode indique un échec par nul ou NON revenir directement, vous devez toujours vérifier que la valeur de retour est nul ou NON avant d'essayer de faire quelque chose avec le objet NSError.


Modifier : Comme NSGod a souligné, revient -removeItemAtPath:error: BOOL, pas NSDictionary *. Je l'ai modifié ma réponse à rendre compte aussi bien.

Non, je fais la même façon et il fonctionne très bien pour détecter les erreurs. Vous n'êtes pas NULL à elle de passage que vous passez un pointeur NULL à ce qui est une chose très différente. Même si une autre option que vous pouvez ajouter est.

if (error != nil){...
}else{
  [NSApp presentError:error]
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top