我想测试一个不返回任何内容的方法。该方法首先声明参数不包含非法值:
- (void) someMethod:(NSString*)param {
NSParamaterAssert(param != @"0");
// more code
}
在我的测试代码中,我想确保捕获非法值,但我不希望程序在测试期间退出。在python中我可以尝试:除了:抓住它。目标C中是否存在等价物?我在这里错误地使用断言吗?
答案 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
更为惯用。