软件测试之SDK开发(ios)——NSException捕获

本文介绍如何在iOS应用中捕获NSException类型的crash,通常由数组越界、字典无Key等问题引发。通过NSSetUncaughtExceptionHandler设置异常处理器,获取exception的name、reason和callStackSymbols等信息,进而定位crash场景,并将相关信息打包为字典上传至服务器。

crash率是衡量产品质量的指标之一,所以SDK需要有捕获crash的能力。
ios中存在很多类型的crash,今天介绍一种最简单的crash类型,NSException。NSException通常由数组越界、字典没有Key等原因引起。NSException的捕获可以使用NSSetUncaughtExceptionHandler函数,将exception抛给处理函数进行处理,通过exception 的 name , reason 和 callStackSymbols等信息即可定位该exception发生的场景。如下所示:

void HandleException(NSException *exception)
{
    [[LLCrashHelper sharedHelper] saveException:exception];
    
    //将crash的有用信息转换成字典
    NSDictionary *crashInfo = [NSDictionary dictionaryWithObjectsAndKeys:exception.name, @"name",
                               exception.reason,@"reason",
                               exception.callStackSymbols,@"stack",nil] ;
    
    [[LLDebugTool sharedTool] uploadBugWithDict:crashInfo exceptionType:CRASH files:nil takeScreenshot:NO complete:^(BOOL result,NSString* zipPath) {
        if(result){
            NSLog(@"上传bug成功");
            [[NSFileManager defaultManager] removeItemAtPath:zipPath error:nil];
        };
        
    } synchronous:YES] ;
    
    [exception raise];
    
}
### 如何在iOS中创建和使用NSExceptioniOS开发中,`NSException` 是 Objective-C 中用于处理异常的类。尽管 Swift 更倾向于使用错误处理(Error Handling)机制,但在某些情况下,仍然可以使用 `NSException` 来捕获和抛出异常[^1]。 以下是创建和使用 `NSException` 的示例代码: ```objc #import <Foundation/Foundation.h> // 抛出 NSException void raiseCustomException() { NSException *exception = [NSException exceptionWithName:@"CustomException" reason:@"This is a custom exception." userInfo:nil]; [exception raise]; // 抛出异常 } // 捕获 NSException void handleExceptions() { @try { raiseCustomException(); } @catch (NSException *exception) { NSLog(@"Caught an exception: %@", exception.reason); } @finally { NSLog(@"Finally block executed."); } } int main(int argc, const char * argv[]) { @autoreleasepool { handleExceptions(); } return 0; } ``` #### 解释 - `NSException` 的创建需要指定三个参数:异常名称、原因描述以及可选的用户信息字典。 - 使用 `[exception raise]` 方法可以触发异常。 - 在 `@try` 块中执行可能抛出异常的代码,在 `@catch` 块中捕获并处理异常,在 `@finally` 块中执行无论是否发生异常都需要执行的代码。 ### 注意事项 虽然 `NSException` 可以用来处理运行时错误,但在 iOS 开发中更推荐使用 Swift 的错误处理机制(`do-try-catch`),因为 `NSException` 通常用于不可恢复的严重错误,例如逻辑错误或程序缺陷。 ### 示例代码说明 上述代码展示了如何创建自定义异常 `CustomException` 并在 `handleExceptions` 函数中捕获它。通过日志输出可以看到异常捕获并处理,同时 `@finally` 块中的代码也会被执行。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值