Tratamento de erros Objective-C

Na programação Objective-C, o tratamento de erros é fornecido com a classe NSError disponível em Foundation framework.

Um objeto NSError encapsula informações de erro mais ricas e extensíveis do que seria possível usando apenas um código de erro ou string de erro. Os principais atributos de um objeto NSError são um domínio de erro (representado por uma string), um código de erro específico do domínio e um dicionário de informações do usuário contendo informações específicas do aplicativo.

NSError

Os programas Objective-C usam objetos NSError para transmitir informações sobre erros de tempo de execução sobre os quais os usuários precisam ser informados. Na maioria dos casos, um programa exibe essas informações de erro em uma caixa de diálogo ou planilha. Mas também pode interpretar as informações e solicitar ao usuário que tente se recuperar do erro ou tente corrigir o erro por conta própria

O objeto NSError consiste em -

  • Domain - O domínio de erro pode ser um dos domínios NSError predefinidos ou uma string arbitrária que descreve um domínio personalizado e o domínio não deve ser nulo.

  • Code - O código de erro para o erro.

  • User Info - O dicionário userInfo para o erro e userInfo pode ser nulo.

O exemplo a seguir mostra como criar um erro personalizado

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];

Aqui está o código completo do exemplo de erro acima passado como referência a um ponteiro -

#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 =@"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; 
}

No exemplo acima, retornamos um nome se o id for 1, caso contrário, definimos o objeto de erro definido pelo usuário.

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

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