You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objective-C静态库抛出异常,主程序如何捕获该异常?

解决Objective-C静态库抛出的NSException无法被示例App捕获的问题

这个坑我之前踩过好几次!你遇到的情况几乎可以肯定是Xcode默认关闭了Objective-C异常捕获的编译选项,导致抛出的异常直接触发崩溃,而不是进入@catch块。下面一步步给你排查和解决:

1. 检查静态库的编译设置

打开你的静态库目标的Build Settings:

  • 搜索Enable Objective-C Exceptions,把它设置为YES(Debug和Release模式都要改)
  • 或者直接搜索OTHER_CFLAGS,确保里面包含-fobjc-exceptions这个编译标志(如果没有就加上)

2. 检查示例App的编译设置

别只改静态库!主App的设置同样重要:

  • 同样找到Enable Objective-C Exceptions,设置为YES
  • 如果你的Deployment Target是iOS 11+或者macOS 10.13+,默认的优化设置可能会更严格,务必确认这个选项没有被自动关闭

3. 确认代码的异常处理语法正确

有时候可能是代码写法的问题,比如混用了C++的try/catch和Objective-C的@try/@catch:

// 静态库中正确抛出NSException的示例
- (void)triggerError {
    NSException *exception = [NSException exceptionWithName:@"LibraryException"
                                                     reason:@"Invalid input"
                                                   userInfo:nil];
    @throw exception;
    // 或者用raise方法:[exception raise];
}

// 示例App中正确捕获的代码
@try {
    [libraryObject triggerError];
} @catch (NSException *exception) {
    NSLog(@"捕获到异常:%@", exception.reason);
} @finally {
    // 可选:清理资源的代码
}

注意:必须用Objective-C的@try/@catch语法,C++的try/catch无法捕获Objective-C的NSException。

4. 额外注意:Swift调用的情况

如果你的示例App是Swift写的,默认do/catch是抓不到Objective-C异常的,需要在Objective-C层做一层包装,或者用ObjC.catchException来捕获:

do {
    try ObjC.catchException {
        libraryObject.triggerError()
    }
} catch {
    print("捕获到异常:\(error)")
}

总结一下:核心就是静态库和主App都必须开启Objective-C异常支持,只要其中一方没开,抛出的异常就会直接崩溃而不是被捕获。

内容的提问来源于stack exchange,提问作者Alfonso Tesauro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:51:28