iOS捕獲異常,常用的異常處理方法

[http://www.cocoachina.com/ios/20141229/10787.html]
前言:在開(kāi)發(fā)APP時(shí),我們通常都會(huì)需要捕獲異常,防止應(yīng)用程序突然的崩潰,防止給予用戶(hù)不友好的體驗(yàn)。其實(shí)Objective-C的異常處理方法和JAVA的雷同,懂JAVA的朋友一看就懂。我為什么要寫(xiě)這篇博文呢?因?yàn)槲野l(fā)現(xiàn)百度上的介紹方法,很多都不是我想要的,而我想要的又說(shuō)得不清楚,重點(diǎn)是大家都是直接復(fù)制別人的代碼。。。于是不多說(shuō),大家往下看~~~
以下程序已測(cè)試并通過(guò):
設(shè)備:iOS 8模擬器中
開(kāi)發(fā)工具:XCode6.1
使用@try、catch捕獲異常:
以下是最簡(jiǎn)單的代碼寫(xiě)法,其中@finally可以去掉:

@try {
    // 可能會(huì)出現(xiàn)崩潰的代碼
}
@catch (NSException *exception) {
    // 捕獲到的異常exception
}
@finally {
    // 結(jié)果處理
}

在這里舉多一具比較詳細(xì)的方法,拋出異常:

@try {
    // 1
    [self tryTwo];
}
@catch (NSException *exception) {
    // 2
    NSLog(@"%s\n%@", __FUNCTION__, exception);
//        @throw exception; // 這里不能再拋異常
}
@finally {
    // 3
    NSLog(@"我一定會(huì)執(zhí)行");
}
// 4
// 這里一定會(huì)執(zhí)行
NSLog(@"try");

tryTwo方法代碼:

- (void)tryTwo
{
    @try {
        // 5
        NSString *str = @"abc";
        [str substringFromIndex:111]; // 程序到這里會(huì)崩
    }
    @catch (NSException *exception) {
        // 6
//        @throw exception; // 拋出異常,即由上一級(jí)處理
        // 7
        NSLog(@"%s\n%@", __FUNCTION__, exception);
    }
    @finally {
        // 8
        NSLog(@"tryTwo - 我一定會(huì)執(zhí)行");
    }
     
    // 9
    // 如果拋出異常,那么這段代碼則不會(huì)執(zhí)行
    NSLog(@"如果這里拋出異常,那么這段代碼則不會(huì)執(zhí)行");
}

為了方便大家理解,我在這里再說(shuō)明一下情況:
如果6拋出異常,那么執(zhí)行順序?yàn)椋?->5->6->8->3->4
如果6沒(méi)拋出異常,那么執(zhí)行順序?yàn)椋?->5->7->8->9->3->4

2)部分情況的崩潰我們是無(wú)法避免的,就算是QQ也會(huì)有崩潰的時(shí)候。因此我們可以在程序崩潰之前做一些“動(dòng)作”(收集錯(cuò)誤信息),以下例子是把捕獲到的異常發(fā)送至開(kāi)發(fā)者的郵箱。

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
    return YES;
}
 
void UncaughtExceptionHandler(NSException *exception) {
    /**
     *  獲取異常崩潰信息
     */
    NSArray *callStack = [exception callStackSymbols];
    NSString *reason = [exception reason];
    NSString *name = [exception name];
    NSString *content = [NSString stringWithFormat:@"========異常錯(cuò)誤報(bào)告========\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",name,reason,[callStack componentsJoinedByString:@"\n"]];
 
    /**
     *  把異常崩潰信息發(fā)送至開(kāi)發(fā)者郵件
     */
    NSMutableString *mailUrl = [NSMutableString string];
    [mailUrl appendString:@"mailto:test@qq.com"];
    [mailUrl appendString:@"?subject=程序異常崩潰,請(qǐng)配合發(fā)送異常報(bào)告,謝謝合作!"];
    [mailUrl appendFormat:@"&body=%@", content];
    // 打開(kāi)地址
    NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}



最后編輯于
?著作權(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)容

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