iOS發行應用中對異常資訊捕獲和處理

來源:互聯網
上載者:User

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:NSUTF8StringEncodingerror: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.