Обработка ошибок Objective-C
В программировании на Objective-C обработка ошибок обеспечивается классом NSError, доступным в Foundation framework.
Объект NSError инкапсулирует более обширную и расширяемую информацию об ошибках, чем это возможно при использовании только кода ошибки или строки ошибки. Основные атрибуты объекта NSError - это домен ошибки (представленный строкой), код ошибки, зависящий от домена, и словарь информации о пользователе, содержащий информацию о приложении.
NSError
Программы Objective-C используют объекты NSError для передачи информации об ошибках времени выполнения, о которых необходимо сообщить пользователям. В большинстве случаев программа отображает эту информацию об ошибке в диалоговом окне или на листе. Но он также может интерпретировать информацию и либо попросить пользователя попытаться исправить ошибку, либо попытаться исправить ошибку самостоятельно.
Объект NSError состоит из -
Domain - Домен ошибки может быть одним из предопределенных доменов NSError или произвольной строкой, описывающей пользовательский домен, и домен не должен быть нулевым.
Code - Код ошибки для ошибки.
User Info - Словарь userInfo для ошибки и userInfo может быть нулевым.
В следующем примере показано, как создать настраиваемую ошибку.
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];
Вот полный код приведенного выше примера ошибки, переданный как ссылка на указатель:
#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;
}
В приведенном выше примере мы возвращаем имя, если идентификатор равен 1, в противном случае мы устанавливаем определяемый пользователем объект ошибки.
Когда приведенный выше код компилируется и выполняется, он дает следующий результат:
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