Каков правильный подход к обработке исключений в iOS? - PullRequest
5 голосов
/ 13 марта 2012

Я узнал, что Objective-C имеет эквивалентный способ обработки исключений, как в C # в .NET. Кроме того, как говорится в Apple Docs, я хотел бы обрабатывать / обрабатывать исключения, создавая объект NSError. Внимательно изучите раздел «Поймать различные виды исключений» в документах обработка исключений

.... Я хотел бы поймать различные типы исключений. В .NET я привык просматривать документ метода класса, чтобы получить возможные исключения, которые он может вызвать. Где взять эту информацию из яблочных документов? Как я узнаю, какие исключения может вызывать -method / object / process-?

Ответы [ 3 ]

5 голосов
/ 13 марта 2012

Как говорится в документации Apple, большинство исключений создаются в исключительных случаях.(Некоторые исключения не такие, как доступ к объекту за пределами NSArray.)

.NET поощряет локальную обработку исключений.Какао написано, чтобы поощрить обработку исключений большого объема.Причина, по которой у вас есть локальная обработка исключений в .NET, заключается в том, что вы ожидаете, что какая-то часть выйдет из строя ожидаемым образом (например, ошибка сети при загрузке чего-либо).В Какао это выполняется с помощью методов, которые вместо этого возвращают NSErrors.Это то же самое, только более заметно в сигнатуре метода.

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

5 голосов
/ 13 марта 2012

Обработка ошибок в мире Objective-C, вероятно, сильно отличается от того, к чему вы привыкли. Короче говоря, забудьте об исключениях. Большинство ошибок обрабатываются возвращаемыми значениями или передачей указателя на NSError*:

NSErrror *error = nil;
BOOL success = [somebody doSomethingWithError:&error];
if (!success) {
    NSLog(@"Got error: %@", error);
}

А на стороне вызываемого абонента:

- (BOOL) doSomethingWithError: (NSError**) error
{
    error = error ? error : &(NSError*){ nil };
    if (somethingWentWrong) {
        *error = [NSError …];
        return NO;
    }
    // All is fine
    return YES;
}

Это выглядит громоздко, но на практике это в основном работает нормально. В том редком случае, когда что-то действительно может вызвать исключение (например, [NSFileHandle writeData:] ), в документации упоминается этот факт, но я не думаю, что вы должны анализировать исключение так же часто, как это принято в другие языки.

2 голосов
/ 13 марта 2012

Посмотрите справочник разработчика для обработки исключений .В какао мы не получаем исключений типа nilArgumentException, мы получаем только NSException.Чтобы получить детализированное сообщение или обработку, вы можете сделать следующее:

if ([[exception name] isEqualToString:MyAppException]) 

Ниже приведен список имен исключений, определенных в заголовочном файле NSException.

FOUNDATION_EXPORT NSString * const NSGenericException;
FOUNDATION_EXPORT NSString * const NSRangeException;
FOUNDATION_EXPORT NSString * const NSInvalidArgumentException;
FOUNDATION_EXPORT NSString * const NSInternalInconsistencyException;

FOUNDATION_EXPORT NSString * const NSMallocException;

FOUNDATION_EXPORT NSString * const NSObjectInaccessibleException;
FOUNDATION_EXPORT NSString * const NSObjectNotAvailableException;
FOUNDATION_EXPORT NSString * const NSDestinationInvalidException;

FOUNDATION_EXPORT NSString * const NSPortTimeoutException;
FOUNDATION_EXPORT NSString * const NSInvalidSendPortException;
FOUNDATION_EXPORT NSString * const NSInvalidReceivePortException;
FOUNDATION_EXPORT NSString * const NSPortSendException;
FOUNDATION_EXPORT NSString * const NSPortReceiveException;

FOUNDATION_EXPORT NSString * const NSOldStyleException;

ИСПРАВЛЕНИЕ:

Вы можете создать подкласс класса NSException, как предлагается в одном из комментариев ниже, чтобы перехватить пользовательское исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...