概述

在开发中经常调用苹果的API遇到数组越界、实例方法不存在运行时等致命错误,此时程序直接奔溃。其实苹果是在函数内部抛出了一个异常。这样告诉开发者需要检查代码做修改。同样在我们自己封装一些框架或者功能时,其它人调用我们提供的方法,外界传入了非法的参数等一些严重的错误我们也可以通过抛出异常告诉调用者。

异常

NSException

NSException是Foundation框架提供的一个类。用于封装一些异常信息,在需要的时候向外抛出。

+ (NSException *)exceptionWithName:(NSExceptionName)name reason:(nullable NSString *)reason userInfo:(nullable NSDictionary *)userInfo;

name为异常名称。reason异常的原因。对比数组越界的异常

NSException有三个常用的属性

@property (readonly, copy) NSExceptionName name;
@property (nullable, readonly, copy) NSString *reason;
@property (readonly, copy) NSArray<NSString *> *callStackSymbols

前两个已经介绍了,callStackSymbols为异常的调用栈信息

NSException抛出

通过关键字@throw将异常抛出。

@throw [NSException exceptionWithName:@"MyFunction" reason:@"方法参数不能传nil" userInfo:nil];

捕获异常

如果调用一个函数其内部抛出异常,如果调用者在外部没有对异常进行处理。则异常通过方法调用链一直往上抛,抛到最顶层UIApplication的delegate还不处理异常,则程序奔溃。
开发中我们不想让在执行有异常的代码导致程序奔溃,有可能异常并不是一个致命性的问题。那么我们需要对异常进行处理。

@try{

}@catch(NSException *exception){

}@finally {

}
  • @try中存放有可能发生异常的代码,如果执行改代码发生异常则进行捕获,捕获到的异常在@catch中拿到。
  • @catch中获取到发生的异常,可以通过NSException获取异常原因跟调用栈信息。
  • @finally 中的代码无论有无异常都会执行的。

提示:一旦@try中的发生异常,@try中后面的代码将不会执行。将会执行@catch、 @finally 中的代码。然后程序继续向下执行。

开发中异常统计

对于线上的运行的程序,用户手机上的程序奔溃我们无法调试。因此我们需获取获程序的奔溃信息,在下一个版本进行优化。开发中通常有开发者自己做奔溃日志的统计或者使用第三方统计工具。一般使用第三方统计平台。原理就是在程序发生闪退是捕获异常将异常存储到本地,在下次程序重启时将异常信息发往服务器。服务器对奔溃日志进行处理并通过网页形式展示出来。

方案一

如果想要捕获程序的异常我们可以在程序的入口main函数进行捕获,一旦程序中有异常可以捕获

#import <UIKit/UIKit.h>
#import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { @try{
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}@catch(NSException *exception){
NSLog(@"%@", exception.callStackSymbols);
}@finally{ }
}
}

还有一种方法:
在Application启动的代理didFinishLaunchingWithOptions注册异常的回调

@implementation AppDelegate
/**
* 拦截异常的回调
*/
void handleException(NSException *exception){ NSLog(@"-----------%@", exception.callStackSymbols);
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. // 设置捕捉异常的回调
NSSetUncaughtExceptionHandler(handleException); return YES;
}

提示:如果程序在内部已经对异常的代码进行了捕捉就不会来到Application注册的异常回调函数。

方案二

使用一些第三方的统计平台。常见的平台有:

最新文章

  1. 病毒四度升级:安天AVL Team揭露一例跨期两年的电信诈骗进化史
  2. mac优秀软件介绍
  3. jqgrid no url reset
  4. 【转】输入/输出流 - 深入理解Java中的流 (Stream)
  5. 运维mysql基础
  6. 【Alpha】团队贡献分配计划
  7. 微软2017校招笔试题3 registration day
  8. animate.css总结
  9. 日常维护管理-DBA运维交接清单
  10. How to avoid C# console applications from closing automatically.
  11. 浏览器页面区域大小的js获取方法
  12. 第一个wxWidgets程序
  13. 【DP_树形DP专题】题单总结
  14. BZOJ1627: [Usaco2007 Dec]穿越泥地
  15. 常用接口简析3---IList和List的解析
  16. Oracle临时表空间组
  17. 创建一个dynamics 365 CRM online plugin (十) - Isolation mode or trust mode
  18. sass安装和语法
  19. zabbix 监控基础
  20. echarts 实现tooltip双栏效果

热门文章

  1. Linux Kernel Development有关内存管理
  2. new delete
  3. docker常用
  4. docker 详细安装及问题排查
  5. Spring IOC源码分析(一):ApplicationContext体系结构设计之自底向上分析
  6. C# WinfForm 控件之dev电子表格 SpreadSheet
  7. ABP 3.7版本迁移数据库报错未能加载文件或程序集“Castle.Core, Version=4.0.0.0”
  8. Java中的数据结构有哪些?HashMap的工作原理是什么?
  9. DOM——节点操作
  10. NX二次开发-UFUN相加布尔操作,可保留或删除目标体,工具体UF_MODL_unite_bodies_with_retained_options