iOS 如何捕獲異常?

在AppDelegate.m 文件

app啓動時(didFinishLaunchingWithOptions),添加一個異常捕獲的監聽

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
    InstallSignalHandler();
    return YES;
}
 //1 把異常崩潰信息發送至開發者郵件
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:[email protected]"];
    [mailUrl appendString:@"?subject=程序異常崩潰,請配合發送異常報告,謝謝合作!"];
    [mailUrl appendFormat:@"&body=%@", content];
    // 打開地址
    NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}

//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];
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章