Objective-C поймать определенный тип исключения - PullRequest
1 голос
/ 18 октября 2010

Я (как некоторые из вас знают из моих других вопросов :)) строю статическую библиотеку Cocoa-touch, и у меня есть код [NSException raise:@"This is the name of my exception" format:@"This is my format", nil], разбросанный по всему проекту в качестве ярлыка для подкласса NSException. Это возвращается, чтобы укусить меня, поскольку мне нужно поймать ТОЛЬКО исключение, в названии которого есть определенная строка, и позволить другим пройти мимо.

Теперь я знаю, что если бы я подкласс NSException, я мог бы сделать это:

@try {
    NSLog(@"This is some code that might raise an exception");
}
@catch (MyException *e){
    NSLog(@"Yep, something went wrong....%@", e);
}
@finally {
    NSLog(@"This is my cleanup code");
}

Но есть ли способ сделать это проще, чем рефакторинг всего моего кода?

Ответы [ 2 ]

3 голосов
/ 18 октября 2010

Нет - подкласс NSException, если вы хотите разные типы исключений.

Однако исключения не должны использоваться для потока управления на iOS.Исключения следует использовать только для невосстановимых ошибок.Не используйте исключения, скажем, для проверки ввода пользователя.

Что касается того, почему вы не должны использовать исключения;фреймворки явно спроектированы и реализованы таким образом, что исключения используются только для обозначения неисправимых ошибок.

Любое исключение, которое выдается через код в фреймворках - выбрасывается через фрейм стека, который находится в фреймворках - будетнеопределенное поведение.

Вы не можете «исправить» это, очистив память в локальной области видимости в @finally (больше, чем вы можете сделать не поточно-безопасный код многопоточным, «применяя достаточное количество блокировок»).

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

Для исправляемых ошибок используйте NSError в том же шаблоне, что и остальные платформы..

1 голос
/ 18 октября 2010

Разве класс NSException не имеет метода доступа для чтения строки, которую вы хотите сопоставить?Тогда вы могли бы написать

@try {
    …
} @catch (NSException *e) {
    if ([[e …] isEqual: @"…"]) {
        …
    } else {
        @throw e;
    }
}
...