1、异常捕捉,并发送邮件ExceptionHelper类封装
2、开始异常 application: didFinishLaunchingWithOptions:中初始化异常捕捉类,然后自动监听异常
ExceptionHelper实现:
#import <Foundation/Foundation.h>
@interface ExceptionHelper : NSObject
+ (ExceptionHelper *) sharedHelper;
+ (void) cleanHelper;
@end
#import "ExceptionHelper.h"
static ExceptionHelper *exceptionHelper = nil;
@interface ExceptionHelper ()
{
}
@implementation ExceptionHelper
+ (ExceptionHelper *) sharedHelper {
@synchronized(self) {
if (exceptionHelper == nil) {
exceptionHelper = [[ExceptionHelper alloc] init];
}
}
return exceptionHelper;
}
#pragma mark -
#pragma mark Lifetime methods
+ (void) cleanHelper
{
[exceptionHelper release];
exceptionHelper = nil;
NSSetUncaughtExceptionHandler(NULL);
}
- (id) init
{
if (self = [super init]) {
NSSetUncaughtExceptionHandler(&UncaughtExceptionHandler);
}
return self;
}
void UncaughtExceptionHandler(NSException *exception) {
NSArray *arr = [exception callStackSymbols];
NSString *reason = [exception reason];
NSString *name = [exception name];
NSString *date = [[NSDate date] description];
NSString *appInfp = GetAppInfo();
NSString *logMsg = [NSString stringWithFormat:@"======== 异常崩溃详情 ========= \ntime:%@ ============================\n%@\nname:%@\nreason:\n%@\ncallStackSymbols:\n%@",
date,
appInfp,
name,
reason,
[arr componentsJoinedByString:@"\n"]];
logMsg = [logMsg stringByAppendingString:@"\n"];
NSString *urlStr = [NSString stringWithFormat:@"mailto:yourname@company.com?subject=%@&body=%@", @"程序异常信息", logMsg];
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
}
+ (id)allocWithZone:(NSZone *)zone {
@synchronized(self) {
if (exceptionHelper == nil) {
exceptionHelper = [super allocWithZone:zone];
return exceptionHelper;
}
}
return nil;
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX;
}
- (oneway void)release {
}
- (id)autorelease {
return self;
}
开始异常捕获:
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
[window makeKeyAndVisible];
// 捕获程序异常
[ExceptionHelper sharedHelper];
return YES;
}
补充:如果出现异常,会将异常信息作为邮件内容,跳转到邮箱页面,如果没配置过邮箱,会被系统引导来配置邮箱,如果已经配置邮箱,那可以选择收件人后点击发送。但只能捕获一般异常信息(OC层次),对于内存问题(C层次),这个异常类就显得鸡肋了。看了好多关于异常捕捉的内容,但没发现可以捕捉内存问题引起的异常,但本实例对于处理OC对象的异常还是可以作为调试参考的。