2013-03-11 14 views
7

私は、マルチレベルのロギングを実装するいくつかのアプリケーションのフレームワークに取り組んでいます。これは、主に他のデバイスとの通信をテストするために社内で使用されるアプリケーションで使用されますが、配布する一部のアプリケーションでも使用されます。iOSでキャッチされていない例外の後にコードを実行する方法はありますか?

キャッチされない例外をキャッチする方法はありますか?すぐに例外をログファイルに保存するコードを実行しますか?現時点では、Logクラスは書き込み失敗などの場合に2つのファイルの間で交互に頻繁にファイルに書き込みます。これは問題ありませんが、未処理の例外が発生したことを確認できれば、ファイルへのエントリ、例外が発生し、その詳細をログに記録してから、アプリケーションをクラッシュさせることができます。

アプリ全体の未処理の例外をキャッチするいくつかの方法があれば、私はそれはようなものになるだろうと思うだろう:誰もが私に洞察力やこれが可能であるか否かの提案を与えることができれば

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

、それ大いに感謝します。 AppDelegate didFinishLaunchingWithOptionsでそれを参照

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

+1

'@try {} @catch(NSException * ex){}'をレスキューに追加します。あるいは、 'NSException'をうんざりしている方法がありますか? –

+1

[NSSetUncaughtExceptionHandler](https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html)を参照してください(ただし、信頼性はあまり高くありません)。 –

+0

[こちら](http://stackoverflow.com/a/12268397/581994)を参照してください。 –

答えて

17

あなたのAppDelegateで、アプリケーション全体の処理されない例外ハンドラを追加することができます

NSSetUncaughtExceptionHandler(&HandleExceptions); 
+0

素晴らしいです、ありがとう! – mbuc91

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); 
} 
関連する問題