iOS 异常体系介绍
iOS 异常体系采用分层架构,从底层硬件到上层应用,异常在不同层次被捕获和处理。理解异常体系的分层结构,有助于我们更好地设计和实现异常监控方案。iOS 异常体系主要分为以下几个层次:
- 硬件层异常
• CPU 异常:由硬件直接产生的异常,如非法指令、内存访问错误等
• 这是最底层的异常来源,所有其他异常最终都源于此 - 系统层异常
• Mach 异常:macOS/iOS 系统最底层的异常机制,源于 Mach 微内核架构
• Unix 信号:Mach 异常会被转换为 Unix 信号,如 SIGSEGV、SIGABRT 等
• 系统层异常是应用层异常监控的主要捕获点 - 运行时层异常
• NSException:Objective-C 运行时异常,如数组越界、空指针等
• C++ 异常:C++ 代码抛出的异常,通过 std::terminate() 处理
• 运行时层异常通常由编程错误引起 - 应用层异常
• 业务逻辑异常:应用自定义的异常和错误
• 性能异常:主线程死锁、内存泄漏等
• 僵尸对象访问:访问已释放对象导致的异常
异常体系的分层关系如下图所示:
异常捕获的层次关系: - 硬件异常 → Mach 异常:CPU 异常被 Mach 内核捕获,转换为 Mach 异常消息
- Mach 异常 → Unix 信号:Mach 异常处理机制会将异常转换为对应的 Unix 信号
- 运行时异常:NSException 和 C++ 异常在运行时层被捕获,如果未处理会触发系统层异常
- 应用层异常:业务异常和性能问题需要应用层主动监控和检测
异常监控策略:
• 系统层监控:通过 Mach 异常和 Unix 信号捕获,可以捕获所有底层异常
• 运行时层监控:通过设置异常处理器(NSUncaughtExceptionHandler、terminate handler)捕获运行时异常
• 应用层监控:通过主动检测机制(死锁检测、僵尸对象检测)发现潜在问题
理解这个分层体系,有助于我们:
• 选择合适的异常捕获机制
• 理解不同异常类型的来源和处理方式
• 设计完整的异常监控方案