Objective c 为什么,当我测试一个方法抛出异常而该方法抛出异常时,测试会停止?

Objective c 为什么,当我测试一个方法抛出异常而该方法抛出异常时,测试会停止?,objective-c,unit-testing,exception,throw,xctest,Objective C,Unit Testing,Exception,Throw,Xctest,我有一个单元测试,测试方法是否在条件存在时抛出异常,方法是否按预期抛出异常 - (void)testMethodThrowsWhenConditionIsPresent { XCTAssertThrows([Foo methodWithCondition: condition], @"Condition is true, method should throw exception"); } 以下是异常源: - (void)methodWithCondition:(someType)co

我有一个单元测试,测试
方法
是否在
条件
存在时抛出异常,
方法
是否按预期抛出异常

- (void)testMethodThrowsWhenConditionIsPresent {
    XCTAssertThrows([Foo methodWithCondition: condition], @"Condition is true, method should throw exception");
}
以下是异常源:

- (void)methodWithCondition:(someType)condition {
    if (condition) {
        [NSException raise: @"condition is true!" format: @"condition is true!"];
    }
}
为什么测试在抛出异常的那一行停止?测试没有继续,它在该行停止,当我希望它继续并从
xctasertthrows()
返回
1
时,使测试成功。相反,测试停止时,Xcode将我带到它抛出的行,并在控制台中显示绿色的“Thread 1:breakpoint 1.1”和调试器

为什么在抛出执行时测试会停止

因为您有一个断点,它会停止执行

为什么在删除断点后,抛出异常时我的应用程序会崩溃

因为您有一个未处理的异常。未处理的异常会导致程序崩溃

如何处理异常,使其不会使程序崩溃

这个问题的简单答案就是不要抛出异常。在其他编程语言中,如Java,这是完全标准的。但在Objective-C中,我们实际上不做例外。在Objective-C中,应该为真正的异常行为保存异常

话虽如此,强烈建议您找到另一种方法来处理您试图处理的任何事情,这就是您在Objective-C中处理异常的方式:

@try {
    // code that could throw an exception
}

@catch (NSException *e) {
    // handle the exception...
}

@finally {
    // post try-catch code, executed every time
}

你为什么说“停”呢?在调试器中是否遇到断点?应用程序是否终止?你怎么知道它停在那一行了?@Jonah我在编辑中澄清了它。那么,你设置了一个异常断点吗?@HotLicks是的,在我的整个项目中。我知道这就是现在的问题。。。有没有办法在测试中选择性地禁用它?您可以删除断点。这很容易再次打开。你的回答非常有用,但我不得不说我不同意“这个问题的简单答案就是不要抛出异常”这一部分。如果这是真的,他们应该删除对xctasertthrows的支持。也许他们应该(您正在抛出一个您期望的意外异常)根据objective-c的异常定义将其删除,但如果他们能够在测试运行时禁用该异常就好了(xCode知道所有这些,它正在运行测试!)。我可能同意,如果您不想看到这一点,请禁用调试器。这就是它的谋生之道。只要在调用抛出代码时测试停止时启用断点即可。我不知道为什么,但我不得不在几周内谷歌两次,因为我认为测试失败了。