Je voudrais ajouter quelques suggestions basées sur ma plus récente de la mise en œuvre. J'ai regardé un peu de code à partir d'Apple et je pense que mon code se comporte de la même manière.
Les postes ci-dessus déjà expliquer comment créer NSError objets et de les retourner, donc je ne vais pas l'embêter avec cette partie. Je vais essayer de proposer un bon moyen d'intégrer des erreurs (codes, messages) dans votre propre application.
Je vous recommande de créer 1 en-tête qui sera un aperçu de toutes les erreurs de votre nom de domaine (c'est à dire de l'app, bibliothèque, etc..). Ma tête ressemble à ceci:
FSError.h
FOUNDATION_EXPORT NSString *const FSMyAppErrorDomain;
enum {
FSUserNotLoggedInError = 1000,
FSUserLogoutFailedError,
FSProfileParsingFailedError,
FSProfileBadLoginError,
FSFNIDParsingFailedError,
};
FSError.m
#import "FSError.h"
NSString *const FSMyAppErrorDomain = @"com.felis.myapp";
Maintenant, avec les valeurs ci-dessus pour les erreurs, Apple va créer une certaine norme de base de message d'erreur pour votre application. Une erreur pourrait être créé comme suit:
+ (FSProfileInfo *)profileInfoWithData:(NSData *)data error:(NSError **)error
{
FSProfileInfo *profileInfo = [[FSProfileInfo alloc] init];
if (profileInfo)
{
/* ... lots of parsing code here ... */
if (profileInfo.username == nil)
{
*error = [NSError errorWithDomain:FSMyAppErrorDomain code:FSProfileParsingFailedError userInfo:nil];
return nil;
}
}
return profileInfo;
}
La norme Apple a généré le message d'erreur (error.localizedDescription
) pour le code ci-dessus va ressembler à ceci:
Error Domain=com.felis.myapp Code=1002 "The operation couldn't be completed. (com.felis.myapp error 1002.)"
Le ci-dessus est déjà bien utile pour un développeur, puisque le message affiche le domaine où l'erreur s'est produite et le code d'erreur correspondant. Les utilisateurs finaux n'ont aucune idée de ce qu'est le code d'erreur 1002
signifie que, alors maintenant, nous devons mettre en œuvre certaines gentils messages pour chaque code.
Pour les messages d'erreur, nous devons garder la localisation dans l'esprit (même si nous n'avons pas de mettre en œuvre les messages de localisation). J'ai utilisé la méthode suivante dans mon projet actuel:
1) créer un strings
fichier qui va contenir les erreurs. Les chaînes de fichiers sont facilement localisables. Le fichier peut ressembler à ceci:
FSError.les chaînes
"1000" = "User not logged in.";
"1001" = "Logout failed.";
"1002" = "Parser failed.";
"1003" = "Incorrect username or password.";
"1004" = "Failed to parse FNID."
2) Ajouter des macros pour convertir les codes entier les messages d'erreur. J'ai utilisé 2 macros dans mon Constantes+Macros.h fichier. J'ai toujours inclure ce fichier dans le préfixe en-tête (MyApp-Prefix.pch
) pour des raisons de commodité.
Les Constantes+Macros.h
// error handling ...
#define FS_ERROR_KEY(code) [NSString stringWithFormat:@"%d", code]
#define FS_ERROR_LOCALIZED_DESCRIPTION(code) NSLocalizedStringFromTable(FS_ERROR_KEY(code), @"FSError", nil)
3) Maintenant, il est facile de montrer à l'utilisateur message d'erreur convivial basé sur un code d'erreur. Un exemple:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:FS_ERROR_LOCALIZED_DESCRIPTION(error.code)
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];