在没有退出的情况下,在ObjC中捕获NSParameterAssert失败

时间:2012-02-18 13:03:18

标签: objective-c unit-testing exception-handling

我想测试一个不返回任何内容的方法。该方法首先声明参数不包含非法值:

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

在我的测试代码中,我想确保捕获非法值,但我不希望程序在测试期间退出。在python中我可以尝试:除了:抓住它。目标C中是否存在等价物?我在这里错误地使用断言吗?

2 个答案:

答案 0 :(得分:2)

您正在使用断言混合“例外”及其“处理”。 (查找有关断言here的更多信息,“异常处理”也在维基百科上,但不幸的是我只允许发布2个链接。)

断言通常不会被用作保护您的方法/程序的方式(通常是严重的)错误(就像错误的功能一样)特殊情况下的行为)。 断言例如用于验证程序。

您希望处理异常(例如您的情况下的错误参数)。 这样做的一个很好的起点是here(仅限ObjC)。

答案 1 :(得分:0)

在Objective-C中,NSAssertion用于仔细检查在一个代码中做出的假设 - 断言应该失败,因为你在代码中犯了错误,而不是因为无效的参数或意外情况。

NSException用于诸如无效参数之类的东西,因此更适合您所谈论的内容(但在测试之外,它不是@catch {{1}的标准做法并继续执行:你只需要在终止之前做一些错误报告。)

以下是在您的情况下使用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 } 块中设置某种标志,如果没有设置标志(即没有抛出异常),则终止

P.S。您也知道,对于您希望在常规程序执行期间(而不是测试)反应错误的情况,@catch更为惯用。