2016-06-14 15 views
4

グローバル例外ハンドラを使いたいです。 applicationdidFinishLaunchingWithOptionsこの中iOS。他のコードがすでにNSSetUncaughtExceptionHandlerを使用している場合、どのように例外を捕捉できますか?

コール:

NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 

と例外を処理するためにこれを使用します。

void uncaughtExceptionHandler(NSException *exception) { 
     // handling exception 
} 

しかし、また、私はすでにNSSetUncaughtExceptionHandlerを使用するSDKを使用しています。その後、例外が発生したときに私のメソッドuncaughtExceptionHandlerは呼び出されませんでした。

私はそれが1つのアプリケーションのための1つのハンドラになることができます知っている。しかし、私はそれとsdkが必要であり、このコードはグローバルレベルで例外を処理できます。

この場合NSSetUncaughtExceptionHandlerをどのように使用することができますか?それとも、グローバルレベルで例外を処理することができる他のアイデアですか? よろしくお願いいたします。

答えて

0

には、NSSetUncaughtExceptionHandlerがハンドラをカバーした後に電話をかけます。あなたよりuncaughtExceptionHandlerが呼び出されます。

さらに、SDKのハンドラを保存してuncaughtExceptionHandlerに呼び出して、SDKを連携させることができます。

例コード:

static NSUncaughtExceptionHandler *exceptionHandler = NULL; 

typedef void (*sighandler_t)(int); 
static sighandler_t sigHandler = NULL; 

static void handleException(NSException *e) 
{ 
    //your code ... 

    //call the SDK handler 
    if (exceptionHandler) { 
     exceptionHandler(e); 
    } 
} 

static void handleSignal(int signal) 
{ 
    //your code ... 

    if (sigHandler) { 
     sigHandler(signal); 
    } 
} 

void installUncaughtExceptionHandler() 
{ 
    // store the SDK handler 
    exceptionHandler = NSGetUncaughtExceptionHandler(); 

    NSSetUncaughtExceptionHandler(&handleException); 

    sigHandler = signal(SIGABRT, handleSignal); 
    signal(SIGILL, handleSignal); 
    signal(SIGSEGV, handleSignal); 
    signal(SIGFPE, handleSignal); 
    signal(SIGBUS, handleSignal); 
    signal(SIGPIPE, handleSignal); 
} 
関連する問題