XCTAssertThrows 可以捕获 c++ 异常吗?

Posted

技术标签:

【中文标题】XCTAssertThrows 可以捕获 c++ 异常吗?【英文标题】:Can XCTAssertThrows catch c++ exception? 【发布时间】:2014-04-22 08:11:03 【问题描述】:

我正在使用 XCTest 对一些 c++/OC 混合代码进行单元测试。我发现 XCTAssertThrows 似乎无法捕获 c++ 异常?

我的用法很简单

比如说,像 c++ test() 这样的表达式

XCTAssertThrows(test(), "has throws")

有什么建议吗?

【问题讨论】:

【参考方案1】:

简答:自己包起来


长答案:您可以为任何 std::exception 包装一个 NSException,像这样

#import <XCTest/XCTest.h>
#import <exception>

@interface NSException (ForCppException)
@end

@implementation NSException (ForCppException)
- (id)initWithCppException:(std::exception)cppException

    NSString* description = [NSString stringWithUTF8String:cppException.what()];
    return [self initWithName:@"cppException" reason:description userInfo:nil];

@end

@interface XCTestCase (ForCppException)
@end

@implementation XCTestCase (ForCppException)
- (void)rethowNSExceptionForCppException:(void(^)())action 
    try 
        action();
     catch (const std::exception& e) 
        @throw [[NSException alloc] initWithCppException:e];
    

@end

#define XCTAssertCppThrows(expression, format...) \
  XCTAssertThrows([self rethowNSExceptionForCppException:^expression;], ## format)

像这样使用它:

#pragma mark - test

void foo() 
    throw std::exception();


void bar() 


@interface testTests : XCTestCase
@end

@implementation testTests
- (void)testExample

    XCTAssertCppThrows(foo(), @"should thow exception");    // succeed
    XCTAssertCppThrows(bar(), @"should thow exception");    // failed

@end

【讨论】:

以上是关于XCTAssertThrows 可以捕获 c++ 异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

XCTAssertThrows 在断点处停止

使用 XCTAssertThrows 模拟进行 Swift 单元测试

在 C++ 中通过指针捕获异常

可以在 C++(17) 中捕获某些对象属性的破坏性分配事件吗?

c++异常捕获

有没有办法在 C++ 中捕获所有异常? [复制]