2013-03-11 9 views
7

Pracuję nad strukturą dla wielu aplikacji, które implementują rejestrowanie wielopoziomowe. Jest używany głównie w aplikacjach używanych do testowania komunikacji z innymi urządzeniami, ale jest również używany w niektórych aplikacjach, które będziemy dystrybuować.Czy istnieje sposób na wykonanie kodu po nieprzechwyconym wyjątku w systemie iOS?

Czy istnieje sposób na przechwycenie nieprzechwyconego wyjątku i natychmiastowe wykonanie kodu w celu zapisania wyjątku do pliku dziennika? W tej chwili klasa Log zapisuje się do pliku co jakiś czas, na przemian między dwoma plikami w przypadku błędu zapisu, itp. Działa to w porządku, ale byłoby wspaniale, gdyby zobaczył, że wystąpił nieobsługiwany wyjątek, napisz dowolny niepisany dziennik wpisów do pliku, zauważ, że wystąpił wyjątek i zapisz jego szczegóły, a następnie zezwól aplikacji na awarię.

Jeśli istnieje jakiś sposób połowu nieobsługiwany wyjątek app-szeroki, to myślę, że byłoby coś takiego:

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

Jeśli ktoś może mi dać wgląd lub sugestie na temat tego, czy jest to możliwe to, Byłbym bardzo doceniony.

+1

'@try {} @catch (NSException * ex) {}' na ratunek. A może niektóre metody swizzling na 'NSException'? –

+1

Zobacz [NSSetUncaughtExceptionHandler] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html) (choć to niezbyt niezawodne). –

+0

Zobacz [tutaj] (http://stackoverflow.com/a/12268397/581994). –

Odpowiedz

17

Możesz dodać moduł obsługi nieobsługiwany wyjątek aplikacji szeroko w AppDelegate:

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

odwoływać w AppDelegate didFinishLaunchingWithOptions jak:

NSSetUncaughtExceptionHandler(&HandleExceptions); 
+0

Niesamowite, dzięki! – mbuc91

3

Można ustawić własny obsługi wyjątku wywołując NSSetUncaughtExceptionHandler()

Możesz to nazwać delegatem aplikacji

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

#ifdef DEBUG 
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
#endif 

... 

} 

Jak widać trzeba przekazać wskaźnik funkcji do funkcji takich jak ten:

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

Musisz ustawić obsługi wyjątku, to najlepiej zrobić w swojej aplikacji delegata w applicationDidFinishLaunching, czyli :

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

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