美文网首页
iOS 如何捕获异常?

iOS 如何捕获异常?

作者: 冰点雨 | 来源:发表于2020-04-19 21:50 被阅读0次

在app启动时(didFinishLaunchingWithOptions),添加一个异常捕获的监听。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
    InstallSignalHandler();
    return YES;
}

方式一:实现捕获异常日志并保存到本地的方法。

void UncaughtExceptionHandler(NSException *exception){
    
    // 异常日志获取
    NSArray  *excpArr = [exception callStackSymbols];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    
    NSString *excpCnt = [NSString stringWithFormat:@"exceptionType: %@ \n reason: %@ \n stackSymbols: %@",name,reason,excpArr];
    
    // 日常日志保存(可以将此功能单独提炼到一个方法中)
    NSArray  *dirArr  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *dirPath = dirArr[0];
    NSString *logDir = [dirPath stringByAppendingString:@"/CrashLog"];
    
    BOOL isExistLogDir = YES;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:logDir]) {
        isExistLogDir = [fileManager createDirectoryAtPath:logDir withIntermediateDirectories:YES attributes:nil error:nil];
    }
    
    if (isExistLogDir) {
        // 此处可扩展
        NSString *logPath = [logDir stringByAppendingString:@"/crashLog.txt"];
        [excpCnt writeToFile:logPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    }
}

方式二:把异常崩溃信息发送至开发者邮件

void UncaughtExceptionHandler(NSException *exception) {
    /**
     *  获取异常崩溃信息
     */
    NSArray *callStack = [exception callStackSymbols];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    NSString *content = [NSString stringWithFormat:@"========异常错误报告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]];
 
    /**
     *  把异常崩溃信息发送至开发者邮件
     */
    NSMutableString *mailUrl = [NSMutableString string];
    [mailUrl appendString:@"mailto:test@qq.com"];
    [mailUrl appendString:@"?subject=程序异常崩溃,请配合发送异常报告,谢谢合作!"];
    [mailUrl appendFormat:@"&body=%@", content];
    // 打开地址
    NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}

获取signal信息

//2. 获取signal信息
void InstallSignalHandler(void){
   signal(SIGHUP, SignalExceptionHandler);
   signal(SIGINT, SignalExceptionHandler);
   signal(SIGQUIT, SignalExceptionHandler);
 
   signal(SIGABRT, SignalExceptionHandler);
   signal(SIGILL, SignalExceptionHandler);
   signal(SIGSEGV, SignalExceptionHandler);
   signal(SIGFPE, SignalExceptionHandler);
   signal(SIGBUS, SignalExceptionHandler);
   signal(SIGPIPE, SignalExceptionHandler);
}
void SignalExceptionHandler(int signal)
{
   NSMutableString *mstr = [[NSMutableString alloc] init];
   [mstr appendString:@"Stack:\n"];
   void* callstack[128];
   int i, frames = backtrace(callstack, 128);
   char** strs = backtrace_symbols(callstack, frames);
   for (i = 0; i <frames; ++i) {
       [mstr appendFormat:@"%s\n", strs[i]];
   }
   [SignalHandler saveCreash:mstr];
}

相关文章

  • iOS 如何捕获异常?

    在app启动时(didFinishLaunchingWithOptions),添加一个异常捕获的监听。 方式一:实...

  • iOS Crash 流程化0:概览

    Ref:iOS Crash 捕获及堆栈符号化思路剖析 iOS Crash 流程化:概览崩溃捕获Mach 异常捕获U...

  • 异常捕获

    异常捕获 有两种 IOS系统的异常NSSetUncaughtExceptionHandler(&exception...

  • iOS异常捕获

    参考的是这篇文章:iOS异常捕获

  • iOS异常捕获

    转载自:向晨宇的技术博客-iOS异常捕获 文章目录前言一. 系统Crash二. 处理signal1. 下面是一些信...

  • iOS 异常捕获

    iOS崩溃情况 一般是由 Mach异常或 Objective-C 异常(NSException)引起的。我们可以针...

  • iOS 捕获异常

    产品测试和上线后往往会遇到一些bug,开发者需要定位到异常的代码这个时候就要捕获异常。 可以通过写一个类Crash...

  • iOS异常捕获

    文章目录 一. 系统Crash 二. 处理signal 下面是一些信号说明 关键点注意 三. 实战 四. Cras...

  • iOS异常捕获

    https://www.dazhuanlan.com/2020/01/06/5e12aaabf0437/https...

  • iOS 捕获异常

    首先创建一个捕获异常的函数: 自定义编写捕获到异常后的逻辑处理 在适当位置添加异常捕获的监听:比如didFinis...

网友评论

      本文标题:iOS 如何捕获异常?

      本文链接:https://www.haomeiwen.com/subject/zlfwbhtx.html