我正在使用以下代码捕获应用中的异常:
void uncaughtExceptionHandler(NSException *exception) {
[FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception];
}
只是想知道我是否可以确定错误发生的引脚,行号,UIView
,类等。理想情况下,我希望得到尽可能详细的信息,因为它是FlurryAPI
分析所捕获的。
FlurryAPI: http://www.flurry.com/
答案 0 :(得分: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];
}
更新(根据@ TommyG的评论):
在NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
中的-(BOOL)application:didFinishLaunchingWithOptions:
方法的末尾添加AppDelegate
。然后将上述方法添加到AppDelegate
。
答案 1 :(得分: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)。
但是,如果您只想要基金会例外,那么您有两个选择: