Manejo de errores de Objective-C
En la programación de Objective-C, el manejo de errores se proporciona con la clase NSError disponible en Foundation framework.
Un objeto NSError encapsula información de error más rica y extensible de lo que es posible usando solo un código de error o una cadena de error. Los atributos principales de un objeto NSError son un dominio de error (representado por una cadena), un código de error específico del dominio y un diccionario de información de usuario que contiene información específica de la aplicación.
NSError
Los programas Objective-C utilizan objetos NSError para transmitir información sobre los errores en tiempo de ejecución sobre los que los usuarios deben estar informados. En la mayoría de los casos, un programa muestra esta información de error en un cuadro de diálogo o en una hoja. Pero también puede interpretar la información y pedirle al usuario que intente recuperarse del error o que intente corregir el error por sí solo.
El objeto NSError consta de:
Domain - El dominio de error puede ser uno de los dominios NSError predefinidos o una cadena arbitraria que describe un dominio personalizado y el dominio no debe ser nulo.
Code - El código de error del error.
User Info - El diccionario userInfo para el error y userInfo puede ser nulo.
El siguiente ejemplo muestra cómo crear un error 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];
Aquí está el código completo de la muestra de error anterior pasada como referencia a un puntero:
#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;
}
En el ejemplo anterior, devolvemos un nombre si el id es 1; de lo contrario, establecemos el objeto de error definido por el usuario.
Cuando se compila y ejecuta el código anterior, produce el siguiente 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