異常捕獲

異常捕獲 有兩種

  • IOS系統(tǒng)的異常
    • NSSetUncaughtExceptionHandler(&exceptionHandler);// exceptionHandler是捕獲的回調(diào)函數(shù)
  • C或者C++ 里面的異常 // signalHandler 也是回調(diào)函數(shù)
    • signal(SIGHUP, signalHandler);
    • signal(SIGINT, signalHandler);
    • signal(SIGQUIT, signalHandler);
    • signal(SIGABRT, signalHandler);
    • signal(SIGILL, signalHandler);
    • signal(SIGSEGV, signalHandler);
    • signal(SIGFPE, signalHandler);
    • signal(SIGBUS, signalHandler);
    • signal(SIGPIPE, signalHandler);
void signalHandler(int signal) {
    
    volatile int32_t _uncaughtExceptionCount = 0;
    int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);
    
    // 如果太多不用處理
    if (exceptionCount > _uncaughtExceptionMaximum) {
        return;
    }
    // 獲取信息
    NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithInt:signal] forKey:SignalExceptionKey];
    NSArray *stackArray = [JHCatchCrash backtrace];
    userInfo[StackAddressesExceptionKey] = stackArray;
    NSLog(@"signalHandler: %@", userInfo);
    // 現(xiàn)在就可以保存信息到本地[]
   
}

void exceptionHandler(NSException *exception) {
    
    volatile int32_t _uncaughtExceptionCount = 0;
    int32_t exceptionCount = OSAtomicIncrement32(&_uncaughtExceptionCount);
    
    // 如果太多不用處理
    if (exceptionCount > _uncaughtExceptionMaximum) {
        return;
    }
    // 異常的堆棧信息
    NSArray *stackArray = [exception callStackSymbols];
    /* 異常理由和名字**/
    NSString *exceptionInfo = [NSString stringWithFormat:@"Exception reason:%@;Exception name:%@",[exception reason], [exception name]];
    NSMutableDictionary *userInfo =[NSMutableDictionary dictionary];
    userInfo[UncaughtExceptionKey] = exceptionInfo;
    userInfo[StackAddressesExceptionKey] = stackArray;
    NSLog(@"exceptionHandler: %@", userInfo);
    // 現(xiàn)在就可以保存信息到本地[]

}


//獲取調(diào)用堆棧
+ (NSArray *)backtrace {
    
    void* callstack[128];
    int frames = backtrace(callstack, 128);
    char **strs = backtrace_symbols(callstack,frames);
    
    NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];
    for (int i=0;i<frames;i++) {
        [backtrace addObject:[NSString stringWithUTF8String:strs[i]]];
    }
    free(strs);
    return backtrace;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 文章目錄 一. 系統(tǒng)Crash 二. 處理signal 下面是一些信號(hào)說(shuō)明 關(guān)鍵點(diǎn)注意 三. 實(shí)戰(zhàn) 四. Cras...
    MTDeveloper閱讀 1,218評(píng)論 1 2
  • 要接入上海分部的自己的性能統(tǒng)計(jì)和事件統(tǒng)計(jì)的 sdk,在接入之前自己了解下??吹搅艘惶撞东@異常的代碼。 對(duì)于異常分為...
    南京小伙閱讀 905評(píng)論 2 1
  • 最近項(xiàng)目上需要對(duì)崩潰信息進(jìn)行處理,要滿足崩潰后及時(shí)捕捉到崩潰信息,當(dāng)應(yīng)用下次打開(kāi)后再將報(bào)文上傳至服務(wù)器...
    迷失之刃閱讀 4,815評(píng)論 9 8
  • 每個(gè)軟件都可能遇到異常,所以從設(shè)計(jì)階段就要考慮異常處理的問(wèn)題,納為業(yè)務(wù)流程的一部分。 異常是需要妥善處理的,但是處...
    藍(lán)灰_q閱讀 3,357評(píng)論 0 4
  • 把你一人扔在酒店一個(gè)晚上和一個(gè)晚上,我不知道你是怎么度過(guò)的。 當(dāng)我匆匆忙忙趕來(lái),卻帶著不舒服的肚子。 常常,我在你...
    減肥的女孩閱讀 212評(píng)論 0 1

友情鏈接更多精彩內(nèi)容