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

前言:在開發APP時,咱們一般都會須要捕獲異常,防止應用程序忽然的崩潰,防止給予用戶不友好的一面。其實OBJECT-C的異常處理方法和JAVA的雷同,懂JAVA的朋友一看就懂。我爲何要寫這篇博文呢?由於我發現百度上的介紹方法,不少都不是我想要的,而我想要的又說得不清楚,重點是你們都是直接複製別人的代碼。。。因而很少說,你們往下看~~~html

 

如下程序已測試並經過:app

設備:IOS8模擬器中ide

開發工具:XCode6.1工具

 

使用@try、catch捕獲異常:開發工具

如下是最簡單的代碼寫法,其中@finally能夠去掉:測試

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

 

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

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

 

tryTwo方法代碼:code

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

爲了方便你們理解,我在這裏再說明一下狀況:component

若是6拋出異常,那麼執行順序爲:1->5->6->8->3->4
若是6沒拋出異常,那麼執行順序爲:1->5->7->8->9->3->4

 

2)部分狀況的崩潰咱們是沒法避免的,就算是QQ也會有崩潰的時候。所以咱們能夠在程序崩潰以前作一些「動做」(收集錯誤信息),如下例子是把捕獲到的異常發送至開發者的郵箱。orm

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:@"========異常錯誤報告========\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]];
}

 

發送郵件的操做,具體請查看個人另外一篇博文:

IOS開發-發送郵件(E-mail)方法整理合集(共3種)

 


博文做者:GarveyCalvin

博文出處:http://www.cnblogs.com/GarveyCalvin/

本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!

相關文章
相關標籤/搜索