iOS已发布应用中对异常信息捕获和处理-阿里云开发者社区

开发者社区> 余二五> 正文

iOS已发布应用中对异常信息捕获和处理

简介:
+关注继续查看

iOS已发布应用中对异常信息捕获和处理

 

 

iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的。

 

iOS提供了异常发生的处理API,我们在程序启动的时候可以添加这样的Handler,这样的程序发生异常的时候就可以对这一部分的信息进行必要的处理,适时的反馈给开发者。

 

不足的地方是,并不是所有的程序崩溃都是由于发生可以捕捉的异常的,有些时候是因为内存等一些其他的错误导致程序的崩溃,这样的信息是不在这里体现的。

 

我做了一个简单的类,进行很基本的操作,可以添加和获取Handler,捕获到异常后将信息写入到appDocumens下的Exception.txt中。

 

其实还有很多的处理的办法。

l  比如可以在程序下一次起来的时候读取这个异常文件发生到服务端。

l  或者直接就是在处理代码中用openurl的方式(mailto:)调用发送邮件的方式,将异常信息直接变成邮件发送到指定地址。

 

以下是完整的代码实现。

 

使用场景示例:

 

#pragma mark -

#pragma mark Application lifecycle

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   

   

    // Override point for customization after application launch.

    

    [window makeKeyAndVisible];

     [NdUncaughtExceptionHandler setDefaultHandler];

     NSArray *array = [NSArray arrayWithObject:@"there is only one objective in this arary,call index one, app will crash and throw an exception!"];

     NSLog(@"%@", [array objectAtIndex:1]);

    

     return YES;

}

 

基本接口展示:

 

#import <Foundation/Foundation.h>

 

@interface NdUncaughtExceptionHandler : NSObject {

 

}

 

+ (void)setDefaultHandler;

+ (NSUncaughtExceptionHandler*)getHandler;

 

@end

//还可以选择设置自定义的handler,让用户取选择

 

接口实现展示

#import "NdUncaughtExceptionHandler.h"

 

NSString *applicationDocumentsDirectory() {

    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectoryNSUserDomainMaskYESlastObject];

}

 

void UncaughtExceptionHandler(NSException *exception) {

     NSArray *arr = [exception callStackSymbols];

     NSString *reason = [exception reason];

     NSString *name = [exception name];

 

     NSString *url = [NSString stringWithFormat:@"=============异常崩溃报告=============\nname:\n%@\nreason:\n%@\ncallStackSymbols:\n%@",

                   name,reason,[arr componentsJoinedByString:@"\n"]];

     NSString *path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"Exception.txt"];

     [url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];

     //除了可以选择写到应用下的某个文件,通过后续处理将信息发送到服务器等

     //还可以选择调用发送邮件的的程序,发送信息到指定的邮件地址

     //或者调用某个处理程序来处理这个信息

}

 

@implementation NdUncaughtExceptionHandler

 

-(NSString *)applicationDocumentsDirectory {

    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectoryNSUserDomainMaskYESlastObject];

}

 

+ (void)setDefaultHandler

{

     NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);

}

 

+ (NSUncaughtExceptionHandler*)getHandler

{

     return NSGetUncaughtExceptionHandler();

}

 

@end

 

异常崩溃报告:

=============异常崩溃报告=============

name:

NSRangeException

reason:

*** -[NSArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]

callStackSymbols:

0   CoreFoundation                      0x02393919 __exceptionPreprocess + 185

1   libobjc.A.dylib                     0x024e15de objc_exception_throw + 47

2   CoreFoundation                      0x0238958c -[__NSArrayI objectAtIndex:] + 236

3   UncaughtE                           0x000022e8 -[UncaughtEAppDelegate application:didFinishLaunchingWithOptions:] + 157

4   UIKit                               0x002b8543 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163

5   UIKit                               0x002ba9a1 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 346

6   UIKit                               0x002c4452 -[UIApplication handleEvent:withNewEvent:] + 1958

7   UIKit                               0x002bd074 -[UIApplication sendEvent:] + 71

8   UIKit                               0x002c1ac4 _UIApplicationHandleEvent + 7495

9   GraphicsServices                    0x02bf9afa PurpleEventCallback + 1578

10  CoreFoundation                      0x02374dc4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52

11  CoreFoundation                      0x022d5737 __CFRunLoopDoSource1 + 215

12  CoreFoundation                      0x022d29c3 __CFRunLoopRun + 979

13  CoreFoundation                      0x022d2280 CFRunLoopRunSpecific + 208

14  CoreFoundation                      0x022d21a1 CFRunLoopRunInMode + 97

15  UIKit                               0x002ba226 -[UIApplication _run] + 625

16  UIKit                               0x002c5b58 UIApplicationMain + 1160

17  UncaughtE                           0x00002228 main + 102

18  UncaughtE                           0x000021b9 start + 53










本文转自 arthurchen 51CTO博客,原文链接:http://blog.51cto.com/arthurchen/734175,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
一次开发、多端分发,阿里巴巴发布AliOS车载小程序
4月16日上海国际车展首日,阿里巴巴小程序有了新动态:正在研发基于AliOS的车载小程序。
14400 0
xcode反汇编调试iOS模拟器程序(六)函数出入口处的处理与局部变量
引用第二节的例子: 函数的入口处,通常都是把esp的值传给ebp保存,然后下面的操作以ebp为基准做偏移量引用。因为esp作为栈指针,push和pop都会自动修改其值,所以用ebp可以不受影响。
705 0
iOS10.3正式版发布:iOS10.3新功能有哪些? 韩俊强的博客
苹果今天发布了iOS 10.3正式版,由于加入了众多新功能,且更换了文件系统,所以非常值得升级,但是如果你打算更新,最好要耐心等待。 一些抢先尝鲜的iPhone 7、7 Plus果粉开始发帖表示(系统大小在600M左右),自己更新iOS 10.3过程中正是焦虑死了,因为安装过程非常长,差不多你要等25分钟左右。
857 0
+关注
12613
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载