Gestion des erreurs Objective-C

Dans la programmation Objective-C, la gestion des erreurs est fournie avec la classe NSError disponible dans Foundation framework.

Un objet NSError encapsule des informations d'erreur plus riches et plus extensibles qu'il n'est possible d'utiliser uniquement un code d'erreur ou une chaîne d'erreur. Les attributs principaux d'un objet NSError sont un domaine d'erreur (représenté par une chaîne), un code d'erreur spécifique au domaine et un dictionnaire d'informations utilisateur contenant des informations spécifiques à l'application.

NSError

Les programmes Objective-C utilisent des objets NSError pour transmettre des informations sur les erreurs d'exécution dont les utilisateurs doivent être informés. Dans la plupart des cas, un programme affiche ces informations d'erreur dans une boîte de dialogue ou une feuille. Mais il peut également interpréter les informations et demander à l'utilisateur de tenter de récupérer de l'erreur ou de tenter de corriger l'erreur par lui-même.

NSError Object se compose de -

  • Domain - Le domaine d'erreur peut être l'un des domaines NSError prédéfinis ou une chaîne arbitraire décrivant un domaine personnalisé et le domaine ne doit pas être nul.

  • Code - Le code d'erreur de l'erreur.

  • User Info - Le dictionnaire userInfo pour l'erreur et userInfo peut être nul.

L'exemple suivant montre comment créer une erreur personnalisée

NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
NSString *desc = NSLocalizedString(@"Unable to complete the process", @"");
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc };
NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];

Voici le code complet de l'exemple d'erreur ci-dessus passé comme référence à un pointeur -

#import <Foundation/Foundation.h>

@interface SampleClass:NSObject
-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr;
@end

@implementation SampleClass

-(NSString *) getEmployeeNameForID:(int) id withError:(NSError **)errorPtr {
   if(id == 1) {
      return @"Employee Test Name";
   } else {
      NSString *domain = @"com.MyCompany.MyApplication.ErrorDomain";
      NSString *desc [email protected]"Unable to complete the process";
      NSDictionary *userInfo = [[NSDictionary alloc] 
      initWithObjectsAndKeys:desc,
      @"NSLocalizedDescriptionKey",NULL];  
      *errorPtr = [NSError errorWithDomain:domain code:-101 
      userInfo:userInfo];
      return @"";
   }
}

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   SampleClass *sampleClass = [[SampleClass alloc]init];
   NSError *error = nil;
   NSString *name1 = [sampleClass getEmployeeNameForID:1 withError:&error];
  
   if(error) {
      NSLog(@"Error finding Name1: %@",error);
   } else {
      NSLog(@"Name1: %@",name1);
   }
   
   error = nil;
   NSString *name2 = [sampleClass getEmployeeNameForID:2 withError:&error];

   if(error) {
      NSLog(@"Error finding Name2: %@",error);
   } else {
      NSLog(@"Name2: %@",name2);
   }

   [pool drain];
   return 0; 
}

Dans l'exemple ci-dessus, nous retournons un nom si l'id est 1, sinon nous définissons l'objet d'erreur défini par l'utilisateur.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

2013-09-14 18:01:00.809 demo[27632] Name1: Employee Test Name
2013-09-14 18:01:00.809 demo[27632] Error finding Name2: Unable to complete the process