2013-03-11 13 views
7

Ich habe an einem Framework für mehrere Anwendungen gearbeitet, die mehrstufige Protokollierung implementiert. Es wird hauptsächlich in internen Anwendungen verwendet, um die Kommunikation mit anderen Geräten zu testen, wird jedoch auch in einigen Anwendungen verwendet, die wir verteilen werden.Gibt es eine Möglichkeit Code nach einer nicht abgefangenen Ausnahme in iOS auszuführen?

Gibt es eine Möglichkeit, eine nicht abgefangene Ausnahme abzufangen und sofort Code auszuführen, um die Ausnahme in der Protokolldatei zu speichern? Im Moment schreibt die Log-Klasse nur gelegentlich in die Datei, wechselt im Falle eines Schreibfehlers usw. zwischen zwei Dateien. Das funktioniert gut, aber es wäre toll, wenn es eine unbehandelte Ausnahme auftreten könnte, schreibe ein ungeschriebenes Protokoll Einträge in Datei, beachten Sie, dass eine Ausnahme aufgetreten ist und protokollieren Sie ihre Details, und erlauben Sie dann die App zum Absturz.

Wenn es eine Möglichkeit ist Ausnahmen zu fangen unhandled app-breit, ich denke, es wäre so etwas wie wäre:

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

Wenn jemand mir Einsicht oder Anregungen geben, ob dies möglich ist, es würde sehr geschätzt werden.

+1

'@try {} @catch (NSException * ex) {}' zur Rettung. Oder vielleicht eine Methode, die auf "NSException" umschaltet? –

+1

Siehe [NSSetUncaughtExceptionHandler] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html) (obwohl es nicht besonders zuverlässig ist). –

+0

Siehe [hier] (http://stackoverflow.com/a/12268397/581994). –

Antwort

17

Sie können eine Anwendung weit nicht behandelte Exception-Handler in Ihrer AppDelegate hinzufügen:

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

Referenz in der AppDelegate didFinishLaunchingWithOptions als:

NSSetUncaughtExceptionHandler(&HandleExceptions); 
+0

Super, danke! – mbuc91

3

Sie können Ihre eigene Exception-Handler gesetzt NSSetUncaughtExceptionHandler() Aufruf

Sie können es Sie als App-Delegat

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

#ifdef DEBUG 
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
#endif 

... 

} 

Wie Sie können Sie einen Funktionszeiger auf eine Funktion wie diese passieren müssen, um sehen:

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

Sie haben Ihre Exception-Handler zu setzen, dies am besten in AppDelegate in applicationDidFinishLaunching erfolgt, dh :

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

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