攻略1-11:处理异常

1、添加一个按钮动作

- (IBAction)throwFakeException:(UIButton *)sender {
    NSException * e = [[NSException alloc] initWithName:@"FakeException" reason:@"The developer sucks!" userInfo:[NSDictionary dictionaryWithObject:@"Extra info" forKey:@"Key"]];
    [e raise];
}

2、通过NSSetUncaughtException函数注册一个处理函数,这个函数是一个void函数,接受一个NSException引用为唯一参数。

//
//  AppDelegate.m
//  ErrorHanding
//
//  Created by 冯敏 on 16/4/29.
//  Copyright © 2016年 fengmin. All rights reserved.
//

#import "AppDelegate.h"
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

@interface AppDelegate ()<UIAlertViewDelegate, MFMailComposeViewControllerDelegate>

@end

@implementation AppDelegate

void exceptionHandler(NSException * exception)
{
    NSLog(@"Uncaught exception:%@\nReason:%@\nUser Info:%@\nCall Stack:%@",exception.name,exception.reason,exception.userInfo,exception.callStackSymbols);

    //Set flag
    NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
    [settings setBool:YES forKey:@"ExceptionOccurredOnLastRun"];
    [settings synchronize];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//预定义的条件宏,使得只有当应用程序运行在真实设备上的时候才使用我们的异常处理代码。
#if !TARGET_IPHONE_SIMULATOR
    //Default excepion handling code
    NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
    if ([settings boolForKey:@"ExceptionOccurredOnLastRun"]) {

        //Reset exception occurred flag
        [settings setBool:NO forKey:@"ExceptionOccurredOnLastRunKey"];
        [settings synchronize];

        //Notify the user
        UIAlertView * altert = [[UIAlertView alloc] initWithTitle:@"We are sorry!" message:@"An error occurred on the previous run!" delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
        [altert addButtonWithTitle:@"Email a Report"];
        [altert show];
    }else{
        //Register exception handle function
        NSSetUncaughtExceptionHandler(&exceptionHandler);

        //Redirect stderr output stream to file
        NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString * documentsPath = [paths objectAtIndex:0];
        NSString * stderrPath = [documentsPath stringByAppendingPathComponent:@"stderr.log"];
        freopen([stderrPath cStringUsingEncoding:NSASCIIStringEncoding], "w", stderr);
    }
#endif

    return YES;
}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentsPath = [paths objectAtIndex:0];
    NSString * stderrPath = [documentsPath stringByAppendingPathComponent:@"stderr.log"];

    if (buttonIndex == 1) {
        //Email a Report
        MFMailComposeViewController * mailComposer = [[MFMailComposeViewController alloc] init];
        mailComposer.mailComposeDelegate = self;
        [mailComposer setSubject:@"Error Report"];
        [mailComposer setToRecipients:[NSArray arrayWithObject:@"[email protected]"]];

        //Attach log file
        NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString * documentsPath = [paths objectAtIndex:0];
        NSString * stderrPaht = [documentsPath stringByAppendingPathComponent:@"stderr.log"];
        NSData * data = [NSData dataWithContentsOfFile:stderrPath];
        [mailComposer addAttachmentData:data mimeType:@"Text/XML" fileName:@"stderr.log"];
        UIDevice * device = [UIDevice currentDevice];
        NSString * emailBody = [NSString stringWithFormat:@"My Model:%@\nMy OS:%@\nMy Version:%@",device.model,device.systemName,device.systemVersion];
        [mailComposer setMessageBody:emailBody isHTML:NO];
        [self.window.rootViewController presentViewController:mailComposer animated:YES completion:^{

        }];
    }

    NSSetUncaughtExceptionHandler(&exceptionHandler);

    //Redirect stderr output stream to file
    freopen([stderrPath cStringUsingEncoding:NSASCIIStringEncoding], "w", stderr);
}

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error
{
    [self.window.rootViewController dismissViewControllerAnimated:YES completion:^{

    }];
}
时间: 2024-10-15 03:05:05

攻略1-11:处理异常的相关文章

淘宝双十一11促销神奇,双11十一充值送红包攻略,双11十一买手机有优惠吗淘宝活动详情

[双十一活动家装汽车会场] 简单,有弹性,喇叭口蛮大的.发过来淘宝双十一11促销神奇,双11十一充值送红包攻略,双11十一买手机有优惠吗的大了,本来想换的,还是怕麻烦,算了,送别人吧 .以后早点联系啊. 不错,慢慢都爱上茵曼了,价格便宜货也不错, 漂亮!!!!!!!!! 正穿着,颜色很艳 [双十一活动主会场] 买大了,75元转,有兴趣的mm联系我,旺旺:秋81705774 [>>>点此查看更多会场] 软软的,手感很好,很喜欢,物流也快,满意, 很好看,就是大了些 很好的宝贝! 颜色看上去

2019阿里云双11拼团全攻略

2019阿里云双11拼团活动于10月24日正式上线啦!这次的拼团活动上线的时间为2019年10月24日-2019年11月11日.我们可以从这次的活动情报来看,可以知道本次的拼团活动是历年双11以来福利最大的了. ? 双11主会场:https://www.aliyun.com/1111/2019/home 拼团1折场:https://www.aliyun.com/1111/2019/group-buying-share ? 今年拼团活动的特色可大致分为三个:? 1.拉新开红包,最高金额可开到111

恶灵高校(二周目)攻略

此篇攻略的目标是击败最终Boss,获得光野圣良SR. 请先看完整篇攻略后,根据自己目前拥有的事件角色(イベキャラ)等级和装备,来提升不足的地方. 目录 一.推荐路线表二.异界攻略三.最终Boss攻略 1.编队与等级2.装备3.道具4.探索“异界奈落”5.最终Boss战6.击败最终Boss后 四.装备材料五.总结 一.推荐路线表 以下是推荐路线表,并非是最短和最佳路线,可根据自身装备和等级来决定行径路线,但请务必按照“关键路线”的顺序来,否则会浪费不必要的回合数. 场所 等级 备注 1F东廊下 L

转载:性能调优攻略

关于性能优化这是一个比较大的话题,在<由12306.cn谈谈网站性能技术>中我从业务和设计上说过一些可用的技术以及那些技术的优缺点,今天,想从一些技术细节上谈谈性能优化,主要是一些代码级别的技术和方法.本文的东西是我的一些经验和知识,并不一定全对,希望大家指正和补充. 在开始这篇文章之前,大家可以移步去看一下酷壳以前发表的<代码优化概要>,这篇文章基本上告诉你——要进行优化,先得找到性能瓶颈! 但是在讲如何定位系统性能瓶劲之前,请让我讲一下系统性能的定义和测试,因为没有这两件事,后

机器学习资料与攻略超强整理吐血推荐(二)

在前文<机器学习资料与攻略超强整理吐血推荐(一)>中,我们讲到要进入人工智能的圈子,数学是不可逾越的第一关,然后我们又推荐了一些你必须掌握的数学方面的资料.接下来,在这一篇中,我们将介绍关于机器学习的理论与工具方面的资料. 二.工具篇 工欲善其事,必先利其器.大数据时代,人工智能的工具趋势是显而易见且确定无疑的.作为一名数据科学家,其实你可以选择的工具非常多,其实随着时代的发展和技术的演进,传统的SPSS.STATA和SAS等这些老牌数据分析工具都已经集成了机器学习和数据挖掘的模块.当然,这不

2048 Puzzle游戏攻略

2048 Puzzle是当前很火的一款手机游戏.在地铁上会经常会看到有人在玩这个游戏. 首先,简单地介绍一下2048 Puzzle游戏.游戏的界面是一个4X4方格,每一个方格中可以放置一个数字.有四种移动数字的方法,向左.向右.向上.向下.当向一个方向移动时,所有的数字都会向这个方向移动,直到前面到了边界,或者有数字挡住.并且在移动方向,相连方格中相同的数字将会被合并.每次移动后,会随机在空白方格中出现2或者4数字,也有可能不出现. 成功条件:合出数字2048. 失败条件:所有方格中都有数字,并

【转】轻松搞定FTP之FlashFxp全攻略

转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融合了一些其他优秀FTP软件的优点.如像CuteFTP一样可以比较文件夹,支持彩色文字显示:像BpFTP支持多文件夹选择文件,能够缓存文件夹:像LeapFTP一样的外观界面,甚至设计思路也比较相似,支持文件夹 (带子文件夹)的文件传送.删除:支持上传.下载及第三方文件续传:可以跳过指定的文件类型,只传

vue-resource全攻略

Vue.js--vue-resource全攻略 概述 上一篇我们介绍了如何将$.ajax和Vue.js结合在一起使用,并实现了一个简单的跨域CURD示例.Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没有必要引入jQuery.vue-resource是Vue.js的一款插件,它可以通过XMLHttpRequest或JSONP发起请求并处理响应.也就是说,$.ajax能做的事情,vue-resource插件一样也能做到,而且vue-re

广州去厦门旅游攻略--(转自 #散文吧网站#)

广州去厦门旅游攻略 发布时间:2016-12-11 17:30 厦门由厦门岛.离岛鼓浪屿.内陆九龙江南岸海沧半岛.集美半岛.翔安区以及同安等组成,陆地面积1699.39Km2,海域面积300多平方公里.厦门的主体--厦门岛南北长13.7公里,东西宽12.5公里,面积约为128.14Km2.是厦门的主要岛屿,也是厦门第一大岛屿.厦门岛是厦门经济特区的发祥地,岛上有厦门的商业和政治中心.各国殖民者最初居住的地方鼓浪屿就在厦门岛西南部.今天小编带给大家的是广州去厦门旅游攻略, 希望对大家有帮助. 厦门