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