iOS已发布应用中对异常信息捕获和处理

4×4矩阵按键计算器:单片机嵌入式硬件实现与中缀表达式解析 矩阵按键是一种通过行列扫描实现多键输入的硬件交互技术,其核心在于IO资源复用与抗抖动状态机设计;中缀表达式解析则涉及运算符优先级判断、括号处理及栈式计算执行,是嵌入式系统中轻量级计算器的关键能力。该方案不依赖操作系统或浮点运算,采用确定性有限状态机与双栈结构,在STM32或AVR等资源受限MCU上实现稳定按键识别、表达式求值与数码管动态显示,适用于电子课程设计、毕业设计及嵌入式入门实战,完整覆盖‘按键→扫描→解析→计算→显示’全链路工程实践。 阅读详情

iOS已发布应用中对异常信息捕获和处理

 

 

iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的。

 

iOS提供了异常发生的处理API,我们在程序启动的时候可以添加这样的Handler,这样的程序发生异常的时候就可以对这一部分的信息进行必要的处理,适时的反馈给开发者。

 

不足的地方是,并不是所有的程序崩溃都是由于发生可以捕捉的异常的,有些时候是因为内存等一些其他的错误导致程序的崩溃,这样的信息是不在这里体现的。

 

我做了一个简单的类,进行很基本的操作,可以添加和获取Handler,捕获到异常后将信息写入到app的Documens下的Exception.txt中。

 

其实还有很多的处理的办法。

l  比如可以在程序下一次起来的时候读取这个异常文件发生到服务端。

l  或者直接就是在处理代码中用openurl的方式(mailto:)调用发送邮件的方式,将异常信息直接变成邮件发送到指定地址。

 

以下是完整的代码实现。

 

使用场景示例:

#pragma mark -
#pragma mark Application lifecycle
 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
   
    // Override point for customization after application launch.
    
    [window makeKeyAndVisible];
     [NdUncaughtExceptionHandler setDefaultHandler];
     NSArray *array = [NSArray arrayWithObject:@"there is only one objective in this arary,call index one, app will crash and throw an exception!"];
     NSLog(@"%@", [array objectAtIndex:1]);
    
     return YES;
}

基本接口展示:

#import <Foundation/Foundation.h>
 
@interface NdUncaughtExceptionHandler : NSObject {
 
}
 
+ (void)setDefaultHandler;
+ (NSUncaughtExceptionHandler*)getHandler;
 
@end
//还可以选择设置自定义的handler,让用户取选择

接口实现展示

#import "NdUncaughtExceptionHandler.h"
 
NSString *applicationDocumentsDirectory() {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
 
void UncaughtExceptionHandler(NSException *exception) {
     NSArray *arr = [exception callStackSymbols];
     NSString *reason = [exception reason];
     NSString *name = [exception name];
 
     NSString *url = [NSString stringWithFormat:@"=============异常崩溃报告=============\nname:\n%@\nreason:\n%@\ncallStackSymbols:\n%@",
                   name,reason,[arr componentsJoinedByString:@"\n"]];
     NSString *path = [applicationDocumentsDirectory() stringByAppendingPathComponent:@"Exception.txt"];
     [url writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
     //除了可以选择写到应用下的某个文件,通过后续处理将信息发送到服务器等
     //还可以选择调用发送邮件的的程序,发送信息到指定的邮件地址
     //或者调用某个处理程序来处理这个信息
}
 
@implementation NdUncaughtExceptionHandler
 
-(NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
 
+ (void)setDefaultHandler
{
     NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
}
 
+ (NSUncaughtExceptionHandler*)getHandler
{
     return NSGetUncaughtExceptionHandler();
}
 
@end

异常崩溃报告:

=============异常崩溃报告=============
name:
NSRangeException
reason:
*** -[NSArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]
callStackSymbols:
0   CoreFoundation                      0x02393919 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x024e15de objc_exception_throw + 47
2   CoreFoundation                      0x0238958c -[__NSArrayI objectAtIndex:] + 236
3   UncaughtE                           0x000022e8 -[UncaughtEAppDelegate application:didFinishLaunchingWithOptions:] + 157
4   UIKit                               0x002b8543 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
5   UIKit                               0x002ba9a1 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 346
6   UIKit                               0x002c4452 -[UIApplication handleEvent:withNewEvent:] + 1958
7   UIKit                               0x002bd074 -[UIApplication sendEvent:] + 71
8   UIKit                               0x002c1ac4 _UIApplicationHandleEvent + 7495
9   GraphicsServices                    0x02bf9afa PurpleEventCallback + 1578
10  CoreFoundation                      0x02374dc4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
11  CoreFoundation                      0x022d5737 __CFRunLoopDoSource1 + 215
12  CoreFoundation                      0x022d29c3 __CFRunLoopRun + 979
13  CoreFoundation                      0x022d2280 CFRunLoopRunSpecific + 208
14  CoreFoundation                      0x022d21a1 CFRunLoopRunInMode + 97
15  UIKit                               0x002ba226 -[UIApplication _run] + 625
16  UIKit                               0x002c5b58 UIApplicationMain + 1160
17  UncaughtE                           0x00002228 main + 102
18  UncaughtE                           0x000021b9 start + 53

http://www.cocoachina.com/newbie/env/2011/1215/3729.html
【WRF-Chem教程第四期上】运行 WRF-Chem 模型 完整介绍运行 WRF-Chem 模型的详细步骤 阅读详情

相关推荐

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7690

iOS已发布应用中对异常信息捕获和处理 .

iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的。   iOS提供了异常发生的处理API,我们在程序启动的时候可以添加这样的Handler,这样的程序发生异常的时候就可以对这一部分的信息进行必要的处理,适时的反馈给开发者。   不足的地方是,并不是所有的程序崩溃都是由于发生可以捕捉的异常

编程路上的野花 512

DFT实战:如何用Synopsys工具搞定多时钟域Scan Chain设计(附避坑指南)

本文详细解析了使用Synopsys DFT Compiler工具链实现多时钟域Scan Chain设计的全流程,包括时钟混合策略、跨时钟域平衡技巧和实战脚本剖析。通过量产验证的工程实践方案,帮助DFT工程师有效解决复杂SoC设计中的Scan Chain挑战,提升测试效率和质量。

mm9012的博客 1033

iOS —— 发布应用的异常信息捕获和处理 NSSetUncaughtExceptionHandler()

iOS已发布应用中对异常信息捕获和处理   转载地址: http://blog.youkuaiyun.com/daiyelang/article/details/17020211    iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的。       iOS提供了异常发生的处理API,我们在程序启动

天空 550

腾讯会议视频过期了怎么办?亲测可用:用这个免费插件抢救你的会议录制与回放

本文提供了三种亲测有效的腾讯会议视频过期恢复方案,包括浏览器缓存提取、专业工具组合及预防性措施。特别推荐使用免费插件抢救过期会议录制与回放,帮助职场人解决重要视频资料丢失的难题。

weixin_33686714的博客 264

Fofa API高阶玩法:用Python批量获取漏洞资产(含OA系统扫描实战)

本文详细介绍了如何利用Python结合Fofa API实现自动化漏洞资产收集的高阶实战技巧。通过构建健壮的客户端、设计精准查询语法、实现多线程批量采集,并以OA系统漏洞扫描为例,演示了从资产发现、过滤验证到报告生成的全流程,旨在提升安全运维与应急响应的效率。

weixin_28607671的博客 498

CH32V303调试新思路:SDI Printf虚拟串口,让调试口不再短缺

嵌入式开发中,调试串口资源紧张是常见痛点,物理UART常被业务通信占用,导致日志输出无处安放。基于调试接口复用的思想,沁恒在RISC-V内核芯片上提供了SDI Printf方案,它利用SWDIO引脚构建虚拟串口,通过WCH-Link将数据上传至PC,实现不占额外引脚的高效调试输出。该技术将调试通道与业务通道彻底隔离,同时与在线调试会话绑定,暂停时日志同步暂停,便于精准定位问题,特别适合CH32V303、CH32V307等多串口占用场景。文章从SDI数据链路、工程配置、代码迁移到实测对比,系统讲解如何在Mou

weixin_34396902的博客 381

Android AudioFlinger实战:如何用FastMixer优化低延迟音频流(附调试技巧)

本文深入解析了Android AudioFlinger的FastMixer线程机制,指导开发者如何利用该技术优化低延迟音频流。通过实战配置AAudio API、调整硬件缓冲区及线程优先级,并结合adb、Systrace等调试技巧,可将音频延迟显著降低至10毫秒以下,适用于音乐制作、游戏音效等实时音频处理场景。

weixin_29230901的博客 335
上一篇: Android SDK更新以及ADT更新出现问题的解决办法
下一篇: ios返回当前时间,精确到毫秒。
Mideveloper
博客等级 码龄14年 157粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值