成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

XCODE開發(fā):iOS開發(fā)捕獲異常的處理方法

2015-01-07 10:23:26來源:cnblogs作者:GarveyCalvin

在開發(fā)APP時,我們通常都會需要捕獲異常,防止應(yīng)用程序突然的崩潰,防止給予用戶不友好的一面。其實Objective-C的異常處理方法和JAVA的雷同,懂JAVA的朋友一看就懂。

前言:在開發(fā)APP時,我們通常都會需要捕獲異常,防止應(yīng)用程序突然的崩潰,防止給予用戶不友好的一面。其實Objective-C的異常處理方法和JAVA的雷同,懂JAVA的朋友一看就懂。我為什么要寫這篇博文呢?因為我發(fā)現(xiàn)百度上的介紹方法,很多都不是我想要的,而我想要的又說得不清楚,重點是大家都是直接復(fù)制別人的代碼。于是不多說,大家往下看~~~

以下程序已測試并通過:

設(shè)備:IOS8模擬器中

開發(fā)工具:XCode6.1

使用@try、catch捕獲異常:

以下是最簡單的代碼寫法,其中@finally可以去掉:

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

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

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

tryTwo方法代碼:

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

為了方便大家理解,我在這里再說明一下情況:

如果6拋出異常,那么執(zhí)行順序為:1->5->6->8->3->4

如果6沒拋出異常,那么執(zhí)行順序為:1->5->7->8->9->3->4

2)部分情況的崩潰我們是無法避免的,就算是QQ也會有崩潰的時候。因此我們可以在程序崩潰之前做一些“動作”(收集錯誤信息),以下例子是把捕獲到的異常發(fā)送至開發(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:@"========異常錯誤報告======== name:%@ reason: %@ callStackSymbols: %@",name,reason,[callStack componentsJoinedByString:@" "]];

    /**
     *  把異常崩潰信息發(fā)送至開發(fā)者郵件
     */
    NSMutableString *mailUrl = [NSMutableString string];
    [mailUrl appendString:@"mailto:test@qq.com"];
    [mailUrl appendString:@"?subject=程序異常崩潰,請配合發(fā)送異常報告,謝謝合作!"];
    [mailUrl appendFormat:@"&body=%@", content];
    // 打開地址
    NSString *mailPath = [mailUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:mailPath]];
}

關(guān)鍵詞:XCODEiOS
主站蜘蛛池模板: 酒泉市| 黑龙江省| 万荣县| 定远县| 抚州市| 呼图壁县| 应城市| 台北县| 九江县| 威远县| 永济市| 新安县| 连山| 白银市| 泗洪县| 买车| 靖江市| 双流县| 密山市| 油尖旺区| 仁寿县| 法库县| 清水河县| 定远县| 阿巴嘎旗| 清水县| 略阳县| 白朗县| 高台县| 沙坪坝区| 资中县| 江门市| 乌海市| 西华县| 长顺县| 江华| 武夷山市| 香港 | 卫辉市| 安康市| 阳城县|