iOS开发系列-异常处理
概述
在开发中经常调用苹果的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注册的异常回调函数。
方案二
使用一些第三方的统计平台。常见的平台有:
iOS开发系列-异常处理的更多相关文章
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
- iOS开发系列--C语言之基础知识
概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...
- iOS开发系列--让你的应用“动”起来
--iOS核心动画 概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建 ...
随机推荐
- Decision Tree、Random Forest、AdaBoost、GBDT
原文地址:https://www.jianshu.com/p/d8ceeee66a6f Decision Tree 基本思想在于每次分裂节点时选取一个特征使得划分后得到的数据集尽可能纯. 划分标准 信 ...
- webpack4 入门配置研究
1. 全局安装 npm install webpack webpack-cli webpack-dev-server -g 1.1)输密文的密码(电脑开机) 1.2)安装成功 2. 输入命令mkdir ...
- 利用MySqlBulkLoader生成csv文件,批量添加数据
DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Yw ...
- apache+tomcat配置负载均衡,实现http与websocket接口分压
一.应用场景 在生产环境中,应用服务器(此文以tomcat为例)不免面临高访问量的压力,相比而言web服务器(此文以apache为例)能够承担更大的并发量.Apache本身带有一些模块,可以完成对应用 ...
- canvas的基础入门
canvas是定义在浏览器上的画布.它不仅仅是一个标签元素更是一个编程工具是一套编程的接口.利用它可以开发出很多东西,比如动画,游戏,动态的图表等富有变现力和感染力的应用.还可以开发出绚丽的3D动态效 ...
- 微信1.8.6.1 SDK 无法授权登录解决办法
我用的cocos2d-lua 3.9 项目打包 调用微信授权登录的时候 授权登录接口一直抛异常导致微信都无法拉起来 按照官网配置了universal link (这个也搞了很长时间jason 配置文件 ...
- CAS机制是什么?有什么缺点,会出现什么问题
CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换. CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B. CAS的缺点: 1.CPU开销较大 在 ...
- 【POJ3155】生活的艰辛Hard Life
题面 Description ADN公司内部共 n个员工,员工之间可能曾经因为小事有了过节,总是闹矛盾.若员工u和员工 v有矛盾,用边(u, v)表示,共 m个矛盾.最近,ADN公司内部越来越不团结, ...
- 使用osgearth2.9 rex引擎在Qt中黑屏的问题修复
将osgUtil::RenderStage.cpp中的下列红色代码注释重新编译即可: if ( !colorAttached ) { setDrawBuffer( GL_NONE, true ); s ...
- 34. Thread类的常用方法
1.构造方法 Thread() 分配新的 Thread 对象. Thread(String name) 分配新的 Thread 对象并指定线程名字 2.方法 1)setName(String nam ...