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

iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的。
 
iOS提供了异常发生的处理API,我们在程序启动的时候可以添加这样的Handler,这样的程序发生异常的时候就可以对这一部分的信息进行必要的处理,适时的反馈给开发者。
 
不足的地方是,并不是所有的程序崩溃都是由于发生可以捕捉的异常的,有些时候是因为内存等一些其他的错误导致程序的崩溃,这样的信息是不在这里体现的。
 
我做了一个简单的类,进行很基本的操作,可以添加和获取Handler,捕获到异常后将信息写入到app的Documens下的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(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
 
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(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
 
+ (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

时间: 2024-07-30 10:37:56

iOS已发布应用中对异常信息捕获和处理(转)的相关文章

Android应用开发中全局异常的捕获

最近在做个项目,需要在程序出现运行时异常和错误导致程序crash时进行一些操作,找到一个方法 Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {// 给主线程设置一个处理运行时异常的handler public void uncaughtException(Thread thread, final Throwable ex) { ex.printStackTrace(); //当程序出现crash时

iOS Xcode为Subview设置的约束条件在iOS 8 &amp; Xcode 6中出现异常

问题重述: 为collectionview设计了一个hearderView,而这个headerView是一个自定义的myview,在这个自定义中有一个subview,它的约束条件是设置到superview的.在Xcode 6和iOS 8的组合下运行,上述的subview完全没有按照原来设计的约束,而是以从(0,0)为原点自己重置layout.但在iOS7 + Xcode 5/6 和iOS8 + Xcode 5 的组合中是正常的. 解决方案: 在初始化myview的时候,添加: self.myVi

IOS 获取系统通讯录中的联系人信息

- (IBAction)getAllContactFromSystem { ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NULL); ABAddressBookRequestAccessWithCompletion(ab, ^(bool granted, CFErrorRef error) { //取得通讯录访问授权 ABAuthorizationStatus authorization= ABAddressBookGet

JAVA获取catch中的异常信息

package com.et.zys.test; import java.io.PrintWriter; import java.io.StringWriter; public class UnicodeTest { public static void main(String[] args) { String str = null; try { System.out.println(str.toString()); }catch(Exception e) { StringWriter stri

Python中获取异常(Exception)信息

异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序结构.如下所示 try: ... except Exception as e: ... 1.str(e) 返回字符串类型,只给出异常信息,不包括异常信息的类型,如1/0的异常信息 'integer division or modulo by zero' 2.repr(e) 给出较全的异常信息,包括异

Laravel 5.4 中的异常处理器和HTTP异常处理实例教程

错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题. 百牛信息技术bainiu.ltd整理发布于博客园 Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不同开发环境切换以及对错误和异常的处理.

第三节:使用Log4net和过滤器记录异常信息,返回异常给前端

上次面试,遇到,在项目中如何处理业务异常和代码异常,使用txt记录异常信息后,如何直接区分出异常的类型,异常怎么分类处理,希望大家能帮我提出宝贵的意见,完善处理异常, 统一返回参数 public class HeaderResult { public HeaderResult() { // ReSharper disable once VirtualMemberCallInConstructor IsSucceed = false; } public virtual bool IsSucceed

Laravel 5.1 中的异常处理器和HTTP异常处理 abort()

原文  http://laravelacademy.org/post/1867.html 错误和异常是处理程序开发中不可回避的议题,在本地开发中我们往往希望能捕获程序抛出的异常并将其显示打印出来,以便直观的知道程序在哪里出了问题并予以解决,而在线上环境我们不希望将程序错误或异常显示在浏览器中(出于安全考虑),这个时候我们仍然要捕获异常,只不过不是显示到浏览器中,而是记录到日志中,方便日后排查问题. Laravel当然支持PHP原生的错误和异常处理,但是在此基础上进行了一些封装处理,从而更方便在不

SpringMVC学习(八)——SpringMVC中的异常处理器

SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 异常处理思路 我们知道,系统中异常包括两类:预期异常和运行时异常(RuntimeException),前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.系统的dao.service.controller出现异常都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,SpringMV