2011-03-31 90 views
9

我使用下面的代碼以捕捉我的應用程序異常:的Objective-C/iPhone - NSException獲取儘可能多的信息可能

void uncaughtExceptionHandler(NSException *exception) { 
    [FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception]; 
} 

只是想知道我是否能夠針點,行號,UIView ,類,等錯誤的發生。理想情況下,我希望獲得儘可能詳細的信息,因爲它被FlurryAPI分析捕獲。

FlurryAPI: http://www.flurry.com/

回答

16

我結束了這是怎麼回事:

void uncaughtExceptionHandler(NSException *exception) { 
    NSArray *backtrace = [exception callStackSymbols]; 
    NSString *platform = [[UIDevice currentDevice] platform]; 
    NSString *version = [[UIDevice currentDevice] systemVersion]; 
    NSString *message = [NSString stringWithFormat:@"Device: %@. OS: %@. Backtrace:\n%@", 
         platform, 
         version, 
         backtrace]; 

    [FlurryAPI logError:@"Uncaught" message:message exception:exception]; 
} 

UPDATE(基於以下@ TommyG的評論):

添加NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);到您的結束 - -(BOOL)application:didFinishLaunchingWithOptions:方法AppDelegate。然後將上述方法添加到AppDelegate

+1

你在哪裏放置這個方法?它在應用程序委託中嗎? – TommyG 2012-03-19 21:12:02

+1

@TommyG將'NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler)'添加到AppDelegate中' - (BOOL)應用程序的末尾:didFinishLaunchingWithOptions:'方法。然後將上述方法添加到AppDelegate。 – alex 2012-07-30 07:32:27

+1

這實際上是否給你一個堆棧跟蹤? – jjxtra 2012-10-06 01:38:54

3

您可以預編譯的優勢,編寫一個宏收集所有的值,例如:

#define __ThrowException(name, reason, class, function, file, line, info) [NSException exceptionWithName:name reason:[NSString stringWithFormat:@"%s:%i (%@:%s) %@", file, line, class, function, reason] userInfo:info]; 
#define ThrowException(name, reason, info) __ThrowException(name, reason, [self class], _cmd, __FILE__, __LINE__, info) 

然而,這隻能在你拋出一個異常,並從在ObjC函數中(self和_cmd是您在ObjC函數中獲得的第一個參數,其中self是指向類的id,而_cmd指向可以(當前!)類型化爲const char的選擇器)。

但是,如果你想這僅適用於基金例外,你有兩個選擇:

  1. 可能在@try()@catch拋出一個異常()塊,然後拋出一個新的自定義裹一切,例外
  2. 獲取堆棧跟蹤,這可能會更難一點,因爲您的應用可能處於不一致的狀態,並且無法收集所有值。收集當前堆棧跟蹤非常詳細,涵蓋here
+0

我明白了,我會在AppDelegate中定義這些宏嗎?如果是這樣,那麼我將如何在我的void uncaughtExceptionHandler(NSException * exception)中使用它們? – fuzz 2011-04-02 04:00:59

+1

@Fulvio Cusumano:好的,這個宏並不意味着要在你的處理程序中使用,因爲現在已經遲到了從預編譯程序獲取所需的值,但應該用它來創建異常,然後將它們扔出去。就像我所說的,如果你只需要Foundations異常,你可以使用@try()和@catch()來創建一個新的異常,或者沿着堆棧走下去。 – JustSid 2011-04-02 07:56:47

相關問題