Рубріки: Теория

Objective-C: обработка ошибок и класс NSError

Игорь Грегорченко

В программировании на Objective-C обработка ошибок обеспечивается с помощью класса NSError, доступного во фреймворке Foundation. Корректная обработка ошибок — очень важная часть повседневного программирования, поэтому в этой статье мы подробно обсудим модель исключений и обработчики ошибок в этом популярном языке программирования.


Обработка ошибок в Cocoa и Cocoa Touch является одновременно простой и гибкой. Не игнорируйте ошибки в своих приложениях: обрабатывайте их изящно и сообщайте пользователям об этих ошибках, о которых они должны знать, в понятной (и, возможно, диалоговой) форме. Концепция исключений присутствует и в Cocoa, но играет незначительную роль по сравнению с другими фреймворками и языками. Используйте их по назначению: для отлова ошибок во время разработки (но не выполнения программы!).

Итак, объект NSError содержит более богатую и расширенную информацию об ошибке, чем это возможно узнать при использовании только кода ошибки или строки ошибки.

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

NSError

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

Объект NSError состоит из:

  • Домен — Домен ошибки может быть одним из предопределенных доменов NSError или произвольной строкой, описывающей пользовательский домен, причем домен не должен быть nil.
  • Код — Код для данной ошибки.
  • Информация о пользователе — код из словаря userInfo для ошибки, при этом userInfo может быть nil.

В следующем кратком примере показано, как самостоятельно создать и обработать пользовательскую ошибку правильно:

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

В приведенном выше примере мы возвращаем имя, если id равен 1, в противном случае мы устанавливаем определяемый пользователем объект (обработчик NSException) ошибки.

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

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

Подведение итогов

Cocoa Touch и Objective-C предлагают два способа работы с ошибками: NSError и исключения.

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

Внимание! Это делает назначение исключений в Objective-C совершенно иным, чем в других языках, таких как Java, где они используются часто.

В этой краткой статье мы рассмотрели в основном класс NSError и некоторые реальные случаи использования исключений (NSException).

 

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023