2012-03-13 2 views
5

Я узнал, что Objective C имеет эквивалентный способ обработки исключений, таких как C#, в .NET. Кроме того, как говорится в документах apple, я хотел бы обрабатывать/обрабатывать исключения, создавая объект NSError. Принимая внимательно посмотреть на раздел «Ловля Различных типов исключений» в документации exception handlingКаков правильный подход к обработке исключений в iOS?

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

спасибо за ваши предложения

Том

ответ

5

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

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

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

+0

спасибо за ваш вклад! – Tom

2

Посмотрите на developer reference for exception handling. В какао мы не получаем исключений, таких как 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; 

CORRECTION:

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

+1

Нет ничего, что могло бы помешать вам подклассифицировать NSException и поймать определенные типы в блоке '@ catch' для вашего собственного кода. –

+0

Спасибо за ваш ответ – Tom

+0

@GrahamLee. Вы очень правы. Вы можете определенно расшириться. Также начал следить за вашим блогом :) – Vignesh

5

Обработка ошибок в мире 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:]), документация упоминает факт, но я не думаю, что вы ожидаете, что вы будете анализировать исключение, как обычно, на других языках.

+0

Привет, спасибо за ваш ответ. просто для моей собственной переоценки-> это означает, что хорошей практикой было бы создать пробоотборный блок try и catch вокруг всего кода в моем проекте (в случае, если я забыл обработать что-то правильно - например, проверку нулевого значения), чтобы предотвратить программное обеспечение от сбоев. и в противном случае я хорошо занимаюсь разработкой и больше не беспокоюсь об обработке исключений? - или просто создайте try и catch-block вокруг моего основного метода, потому что незащищенное исключение все равно будет (и затем зарегистрирует его или представит сообщение пользователю) – Tom

+0

Объекты «Null» обрабатываются по-разному в Objective- C, законно отправлять сообщение объекту «nil». Это иногда приятная экономия времени, а иногда и хорошая ошибка, ожидающая своего появления. Вы можете в основном забыть о блоках try/catch в Objective-C. Всякий раз, когда вы вызываете что-то, что может потерпеть неудачу, посмотрите, как будет возвращена ошибка. В большинстве случаев вы получите ответ «NSError», так что это видно из сигнатуры метода. В крошечном количестве оставшихся случаев документация сообщит вам, что метод может быть брошен, так что вам понадобится блок try/catch. Опять же, такие ситуации встречаются редко. – zoul

+0

спасибо за ваш вклад, приветствия !!! – Tom

Смежные вопросы