Je voudrais ajouter quelques suggestions supplémentaires basées sur ma dernière mise en œuvre. J'ai regardé du code d'Apple et je pense que mon code se comporte de la même manière.
Les articles ci-dessus expliquent déjà comment créer des objets NSError et les renvoyer, donc je ne vais pas m'embêter avec cette partie. Je vais juste essayer de suggérer un bon moyen d'intégrer les erreurs (codes, messages) dans votre propre application.
Je recommande de créer 1 en-tête qui sera un aperçu de toutes les erreurs de votre domaine (ex: application, bibliothèque, etc.). Mon en-tête actuel 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, lorsque vous utilisez les valeurs ci-dessus pour les erreurs, Apple crée un message d'erreur standard de base pour votre application. Une erreur pourrait être créée 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;
}
Le message d'erreur standard généré par Apple ( error.localizedDescription
) pour le code ci-dessus ressemblera à ceci:
Error Domain=com.felis.myapp Code=1002 "The operation couldn’t be completed. (com.felis.myapp error 1002.)"
Ce qui précède est déjà très utile pour un développeur, car le message affiche le domaine où l'erreur s'est produite et le code d'erreur correspondant. Les utilisateurs finaux n'auront aucune idée de ce 1002
que signifie le code d'erreur , alors nous devons maintenant implémenter de beaux messages pour chaque code.
Pour les messages d'erreur, nous devons garder à l'esprit la localisation (même si nous n'implémentons pas immédiatement les messages localisés). J'ai utilisé l'approche suivante dans mon projet actuel:
1) créez un strings
fichier qui contiendra les erreurs. Les fichiers de chaînes sont facilement localisables. Le fichier pourrait ressembler à ceci:
FSError.strings
"1000" = "User not logged in.";
"1001" = "Logout failed.";
"1002" = "Parser failed.";
"1003" = "Incorrect username or password.";
"1004" = "Failed to parse FNID."
2) Ajoutez des macros pour convertir les codes entiers en messages d'erreur localisés. J'ai utilisé 2 macros dans mon fichier Constants + Macros.h. J'inclus toujours ce fichier dans l'en-tête du préfixe ( MyApp-Prefix.pch
) pour plus de commodité.
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) Il est maintenant facile d'afficher un 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];