Учебники

Обработка ошибок Objective C

В программировании Objective C обработка ошибок обеспечивается классом NSError, доступным в платформе Основы.

Объект NSError инкапсулирует более обширную и расширяемую информацию об ошибках, чем это возможно, используя только код ошибки или строку ошибки. Основными атрибутами объекта NSError являются домен ошибок (представленный строкой), код ошибки, специфичный для домена, и словарь информации о пользователе, содержащий информацию, специфичную для приложения.

NSError

Программы Objective-C используют объекты NSError для передачи информации об ошибках во время выполнения, о которых необходимо информировать пользователей. В большинстве случаев программа отображает эту информацию об ошибке в диалоговом окне или на листе. Но он также может интерпретировать информацию и попросить пользователя попытаться исправить ошибку или попытаться исправить ошибку самостоятельно.

NSError Object состоит из —

  • Домен — домен ошибки может быть одним из предопределенных доменов NSError или произвольной строкой, описывающей пользовательский домен, и домен не должен быть равен нулю.

  • Код — код ошибки для ошибки.

  • Информация о пользователе — словарь userInfo для ошибки и userInfo может быть ноль.

Домен — домен ошибки может быть одним из предопределенных доменов NSError или произвольной строкой, описывающей пользовательский домен, и домен не должен быть равен нулю.

Код — код ошибки для ошибки.

Информация о пользователе — словарь 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];

Вот полный код вышеприведенного примера ошибки, переданного как ссылка на указатель:

Live Demo

#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, в противном случае мы устанавливаем пользовательский объект ошибки.

Когда приведенный выше код компилируется и выполняется, он дает следующий результат —