В программировании на Objective-C обработка ошибок обеспечивается с помощью класса NSError, доступного во фреймворке Foundation. Корректная обработка ошибок — очень важная часть повседневного программирования, поэтому в этой статье мы подробно обсудим модель исключений и обработчики ошибок в этом популярном языке программирования.
Обработка ошибок в Cocoa и Cocoa Touch является одновременно простой и гибкой. Не игнорируйте ошибки в своих приложениях: обрабатывайте их изящно и сообщайте пользователям об этих ошибках, о которых они должны знать, в понятной (и, возможно, диалоговой) форме. Концепция исключений присутствует и в Cocoa, но играет незначительную роль по сравнению с другими фреймворками и языками. Используйте их по назначению: для отлова ошибок во время разработки (но не выполнения программы!).
Итак, объект 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).
На фоне роста спроса на ликвидность в бычьем рынке 2025 года, криптозаймы снова выходят на…
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…