IOS开发~异常捕捉,发送邮件

本文介绍了一个用于Objective-C项目的异常捕捉类ExceptionHelper,通过在应用启动时初始化该类,可以自动监听并捕获程序中发生的异常。一旦捕获到异常,会将详细信息整理成邮件内容并引导用户发送邮件进行反馈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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对象的异常还是可以作为调试参考的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zfpp25_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值