Objective c 在ObjC中捕获失败的NSParameterAssert而不退出

Objective c 在ObjC中捕获失败的NSParameterAssert而不退出,objective-c,unit-testing,exception-handling,Objective C,Unit Testing,Exception Handling,我想测试一个不返回任何内容的方法。该方法首先断言参数不包含非法值: - (void) someMethod:(NSString*)param { NSParamaterAssert(param != @"0"); // more code } 在我的测试代码中,我希望确保捕获非法值,但我不希望程序在测试期间退出。在python中,我可以尝试:except:捕捉它。目标C中是否有一个等价物?我是否在这里错误地使用了断言?您将“异常”及其“处理”与断言混为一谈。 (有关断言的更多信

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

- (void) someMethod:(NSString*)param {
    NSParamaterAssert(param != @"0");
    // more code
}
在我的测试代码中,我希望确保捕获非法值,但我不希望程序在测试期间退出。在python中,我可以尝试:except:捕捉它。目标C中是否有一个等价物?我是否在这里错误地使用了断言?

您将“异常”及其“处理”与断言混为一谈。 (有关断言的更多信息,维基百科上也有“异常处理”,但不幸的是,我只能发布2个链接)

断言通常不被用作防止方法/程序出现
(通常是严重的)错误(如特殊情况下的错误函数行为)的方法。例如,断言用于程序的验证

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

在Objective-C中,
NSAssertion
用于双重检查代码中所做的假设。断言应该只会因为代码中的错误而失败,而不是因为无效参数或意外条件

NSException
用于无效参数等,因此更适合您所说的内容(但在测试之外,捕获
一个
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
块中设置某种标志,如果未设置标志(即未引发异常),则终止


另外,正如您所知,对于希望在常规程序执行期间(与测试相反)对错误作出反应的情况,
NSError
更为惯用

我很高兴看到一个如何使用NSError的示例,但是@Jurlie是正确的,我不想向该方法添加参数-我只想在不重新编码的情况下对其进行外部验证。我认为NSException可能更合适。也许我在问题中没有说清楚,但如果传递给方法的参数格式不正确,我希望程序退出。然后,我希望测试代码检查参数检查,并且仅在允许通过格式错误的参数时退出。谢谢,NSException和“@try@catch@finally”的组合很好地完成了这项工作。