2013-08-06 2 views
4

Оправдания моего глупого вопроса, я хотел бы использовать задвижку для конкретного исключения, NSInvalidArgumentException, поэтому, у меня есть следующий код в моем проекте OSX:Конкретное исключение в Objective-C

@try

{

...

} @catch (NSInvalidArgumentException * исключение)

{

...

}

но Xcode говорят мне: "неизвестное имя типа" NSInvalidArgumentException", поэтому б импортировала

импорта«Фонд/Фонд .h "или

импорт" Фонд/NSException.h "

но ничего не случилось, кто-нибудь знает, в каком пакете или библиотеке есть NSInvalidArgumentException? или это моя ошибка? или строго необходимо уловить все исключения, используя суперкласс NSException? в документации разработчика не показывают, что так будет.

С уважением.

+3

Иисус Христос, люди: Objective-C не является Java. ** Исправьте свои ошибки *, не поймайте их. Исключения являются фатальными и должны оставаться такими. Тем не менее, никто в своем уме не подклассифицирует NSException. Мы генерируем исключения с именами типов в качестве параметра, заданного при создании исключения. 'NSInvalidArgumenrException' является строковой константой где-то. – CodaFi

+0

Человек? Я знаю это, но причина, по которой существует исключение, состоит в том, что может случиться, спасибо за ваш комментарий :) – Servio

+1

@CodaFi Я согласен, но я бы хотел, чтобы вы перепроверили этот комментарий без профанации. – Rob

ответ

8

NSInvalidArgumentException не является исключением. Это строка, которая будет возвращена в свойстве name для исключения. Таким образом, вы должны поймать ваше исключение, а name свойство не совпадает, вы можете повторно @throw исключения вы не собираетесь обрабатывать и т.д .:

@try { 
    // code that generates exception 
} 
@catch (NSException *exception) { 
    if ([exception.name isEqualToString:NSInvalidArgumentException]) 
    { 
     // handle it 
    } 
    else 
    { 
     @throw; 
    } 
} 

ВИДЕТЬ Exception Programming Topics для получения дополнительной информации.

Должен признаться, что я разделяю обеспокоенность CodaFi о том, что это не является надлежащим использованием исключений. Гораздо лучше запрограммировать защиту, проверить свои параметры перед вызовом методов Cocoa и просто убедиться, что вы не генерируете исключения в первую очередь. Если вы обратитесь к Dealing with Errors секции Программирования с Objective-C руководства, исключения предназначены для «ошибки программиста», и они говорят:

Вы не должен использовать примерочные поймать блок вместо стандартного программирования проверяет методы Objective-C.

0

кто известен в какой пакет или библиотека NSInvalidArgumentException?

Это заявлено в Основании Фонда, в NSException.h.Как CodaFi писал в комментарии, это не тип, это строковая константа, объявлена ​​как FOUNDATION_EXPORT NSString * const NSInvalidArgumentException;

Так импортирующей более заголовков не будет исправить вашу проблему, потому что @catch(NSInvalidArgumentException* exception), как писать @catch(@"A string constant"* exception), у вас есть объект, где ожидается тип.

Сказав это, не используйте исключения для управления потоком. Посмотрите на последнюю часть this answer on SO

+0

спасибо, теперь я знаю больше об обработке исключений в объективе-c – Servio

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