iOS捕获异常,常用的异常处理方法

来源:互联网 发布:交通数据百度百科 编辑:程序博客网 时间:2024/04/26 01:06

前言:在开发APP时,我们通常都会需要捕获异常,防止应用程序突然的崩溃,防止给予用户不友好的体验。其实Objective-C的异常处理方法和JAVA的雷同,懂JAVA的朋友一看就懂。我为什么要写这篇博文呢?因为我发现百度上的介绍方法,很多都不是我想要的,而我想要的又说得不清楚,重点是大家都是直接复制别人的代码。。。于是不多说,大家往下看~~~

以下程序已测试并通过:

设备:iOS 8模拟器中

开发工具:XCode6.1

使用@try、catch捕获异常:

以下是最简单的代码写法,其中@finally可以去掉:


@try {
    // 可能会出现崩溃的代码
}
@catch (NSException *exception) {
    // 捕获到的异常exception
}
@finally {
    // 结果处理
}

在这里举多一具比较详细的方法,抛出异常:


@try {
    // 1
    [self tryTwo];
}
@catch (NSException *exception) {
    // 2
    NSLog(@"%s\n%@", __FUNCTION__, exception);
//        @throw exception; // 这里不能再抛异常
}
@finally {
    // 3
    NSLog(@"我一定会执行");
}
// 4
// 这里一定会执行
NSLog(@"try");

tryTwo方法代码:


- (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(@"如果这里抛出异常,那么这段代码则不会执行");
}

为了方便大家理解,我在这里再说明一下情况:
如果6抛出异常,那么执行顺序为:1->5->6->8->3->4
如果6没抛出异常,那么执行顺序为:1->5->7->8->9->3->4

2)部分情况的崩溃我们是无法避免的,就算是QQ也会有崩溃的时候。因此我们可以在程序崩溃之前做一些“动作”(收集错误信息),以下例子是把捕获到的异常发送至开发者的邮箱。

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

     From:http://www.cocoachina.com/ios/20141229/10787.html


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕吐酮体4个加号怎么办 怀孕尿酮体3是怎么办 孕后期尿酮体高怎么办 糖尿病尿酮体3是怎么办 孕39加6没反应怎么办 孕33周感冒咳嗽怎么办 孕33周感冒鼻塞怎么办 孕29周感冒了怎么办 孕35周感冒鼻塞怎么办 孕33周感冒头疼怎么办 胆囊炎和胆结石同时得了该怎么办 体检时来例假了怎么办 梦幻西游没蓝了怎么办 u盘文件删除不了怎么办 魔兽争霸3没路了怎么办 独立显卡玩lol卡怎么办 住6楼发生地震怎么办 地震来了住高层怎么办 拆了点剪力墙怎么办 地震后房子塌了怎么办 房子住70年以后怎么办 房子住满70年后怎么办 房子的年限过了怎么办 配重墙已经拆了怎么办 把配重墙拆了怎么办啊 睡在潮湿的环境怎么办 剪力墙开了门洞怎么办 承重墙开了横槽怎么办 剪力墙拆了一点怎么办 买的楼房70年后怎么办 老小区成危房了怎么办 地震来了怎么办教案ppt 地震来了怎么办手抄报 地震来了在家里怎么办 脸上有黑头毛孔又粗怎么办 17岁看起来显老怎么办 所有证件都丢了怎么办 护师成绩没打印怎么办 护士执业证丢了怎么办 护士证过期5年怎么办 护士证过期2年了怎么办