Objective-C / iPhone - NSException捕获尽可能多的信息

我正在使用以下代码捕获我的应用程序中的异常:
void uncaughtExceptionHandler(NSException *exception) {
    [FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception];
}
只是想知道我是否可以确定错误发生的针脚,行号,
UIView
,类等。理想情况下,我希望获得尽可能详细的信息,因为它是由
FlurryAPI
分析捕获的。 FlurryAPI: http://www.flurry.com/     
已邀请:
我结束了这个:
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];
}
更新(根据@ TommyG的评论): 在
AppDelegate
中将
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
添加到 -
-(BOOL)application:didFinishLaunchingWithOptions:
方法的末尾。然后将上述方法添加到
AppDelegate
。     
您可以利用预编译器并编写一个收集所有值的宏,例如:
#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
指向选择器,可以是(目前!)typecasted到const char)。 但是,如果您只想要基金会例外,那么您有两个选择: 在@try()@catch()块中包装可能引发异常的所有内容,然后抛出一个新的自定义异常 获取堆栈跟踪,这可能会有点困难,因为您的应用程序可能处于不一致状态并且无法收集所有值。这里详细介绍了收集当前堆栈跟踪的方法。     

要回复问题请先登录注册