Не удалось перехватить NSParameterAssert в ObjC без выхода - PullRequest
1 голос
/ 18 февраля 2012

Я хочу протестировать метод, который ничего не возвращает.Метод начинается с утверждения, что параметр не содержит недопустимого значения:

- (void) someMethod:(NSString*)param {
    NSParamaterAssert(param != @"0");
    // more code
}

В моем тестовом коде я хочу убедиться, что недопустимые значения перехвачены, но я не хочу, чтобы программа закрывалась во время выполнения.тестирование.В питоне я могу попробовать: кроме: поймать его.Есть ли эквивалент в Objective C?Я неправильно использую утверждения здесь?

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

Вы смешиваете " Исключения " и их " Обработка " с утверждениями . (Более подробная информация об утверждениях здесь , «Обработка исключений» также есть в Википедии, но, к сожалению, мне разрешено публиковать только 2 ссылки).

Утверждения обычно не используются как способ для сохранения вашего метода / программы от (обычно серьезных) ошибок (например, неправильное поведение функции в специальных случаев). Утверждения используются, например, при проверке программ.

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

0 голосов
/ 18 февраля 2012

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

NSException используется для таких вещей, как недопустимые аргументы и т. Д. И, следовательно, лучше подходит для того, о чем вы говорите (но вне тестирования это не стандартная практика для @catch * NSException и продолжения выполнения: вместо этого вы бы просто сделали несколько отчетов об ошибках перед завершением).

Вот как вы будете использовать NSException в вашей ситуации.Сначала измените someMethod: следующим образом:

- (void) someMethod:(NSString*)param  {
    if (param == @"0") {
        [NSException raise:@"Invalid param value" format:@"param of 0 is invalid"];
    }
    // more code
}

Затем, когда вы позвоните someMethod:

@try {
    [yourObject someMethod:@"0"];
}
@catch (NSException *exception) {
    NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
}
@finally {
    //any code that should be executed whether or not the exception is raised
}

На основании вашего комментария, я думаю, вы захотите установить какой-то видфлаг в блоке @catch, и если флаг не установлен (т. е. исключение не было выброшено), то завершается.

PS Точно так же, как вы знаете, для ситуаций, когда вы хотите реагировать на ошибкиво время обычного выполнения программы (в отличие от тестирования) NSError более идиоматично.

...