2013-03-11 47 views
7

我一直在爲一些實現多級日誌記錄的應用程序開發框架。它主要用於內部用於測試與其他設備通信的應用程序,但也用於我們將分發的某些應用程序。有沒有辦法在iOS中未捕獲的異常之後執行代碼?

是否有任何方法來捕獲未捕獲的異常,並及時執行代碼以將異常保存到日誌文件?目前,Log類只是經常寫入文件,在寫入失敗的情況下在兩個文件之間交替,等等。這可以正常工作,但是如果它能夠看到未處理的異常發生,寫入任何未寫入的日誌請注意發生異常並記錄其詳細信息,然後允許應用程序崩潰。

如果捕獲未處理的異常,應用範圍的一些方法,我認爲這將是這樣的:

appDidReceiveUnhandledException:(NSException *)exception 
{ 
    //write log to disk 
    //append exception info to log file 
    //rethrow exception 
} 

如果任何人都可以給我的見解或是否這是可能的建議,它將不勝感激。

+1

'@try {} @catch(NSException * ex){}'來拯救。或者,也許某種方法在NSException上滾動? – 2013-03-11 21:27:56

+1

請參閱[NSSetUncaughtExceptionHandler](https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html)(雖然它不是非常可靠)。 – 2013-03-11 21:33:35

+0

請參閱[這裏](http://stackoverflow.com/a/12268397/581994)。 – 2013-03-11 21:35:07

回答

17

你可以在你的AppDelegate添加應用程序範圍內未處理的異常處理:在AppDelegate中didFinishLaunchingWithOptions作爲

void HandleExceptions(NSException *exception) { 
    NSLog(@"The app has encountered an unhandled exception: %@", [exception debugDescription]); 
    // Save application data on crash 
} 

參考吧:

NSSetUncaughtExceptionHandler(&HandleExceptions); 
+0

太棒了,謝謝! – mbuc91 2013-03-12 19:24:02

3

你可以通過調用NSSetUncaughtExceptionHandler()設置自己的異常處理程序

你可以稱它爲你的應用程序代理

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

#ifdef DEBUG 
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
#endif 

... 

} 

正如你看到的,你需要一個函數指針傳遞給一個函數像這樣的:

void uncaughtExceptionHandler(NSException *exception) 
{ 
    NSLog(@"App Crash:\n%@", exception); 
    NSLog(@"Stack Trace:\n%@", [exception callStackSymbols]); 
} 
1

你必須設置你的異常處理程序,這是最好的應用程序委託中的applicationDidFinishLaunching完成,即:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    NSSetUncaughtExceptionHandler(&mExceptionHandler); 
} 

- (void)mExceptionHandler(NSException *exception) { 
    NSLog(@"Exception %@", exception); 
} 
相關問題