OC学习8——异常处理
1、和Java一样,OC也有自己的一套异常处理机制,不同的是,OC中的异常处理机制并不是作为常规的编程实践,通常只是作为一种程序调试、排错机制。
2、与Java中类似,OC中也是采用@try。。。@catch。。。@finally。。。的机制来捕获和处理异常,开发者可以将可能引发异常的代码放在@try后的代码块中,当程序引发异常时,该异常可以使用@catch进行捕获。
- @try:将可能出现异常的代码放在@try块中定义
- @catch:所有的一场逻辑都放在@catch块中进行处理
- @finally:最后应用@finally块来进行资源回收,@finally块中的内容是肯定会被执行的。因此,一般不要在@finally中使用return、@throw等导致方法终止的语句,一旦@finally块中使用了return、@throw语句,就会导致@try以及@catch块中的return、@throw语句失效。这一点与Java中是一致的。
@try
{
//业务实现代码
}
@catch (异常1 ex)
{
//异常处理代码
}
@catch (异常2 ex2)
{
//异常处理代码
}
//可能更多的@catch块
。。。
@finally
{
//资源回收
}
如果执行@try块里的业务逻辑代码出现异常,系统将自动生成一个一场对象,该异常对象被提交给系统,这个过程被称之为抛出(throw)异常。当运行环境接收到异常对象时,会依次判断该异常对象事都是@catch块后异常类或其子类的实例,如果是,那么运行话你就能够调用该@catch块来处理该异常这个过程称之为捕获(catch)异常,如果不是则再次用该异常对象和下一个@catch块里的异常类进行比较,如果系统无法找到处理该异常的@catch块,程序就此退出。@finally块是在@try块或@catch块执行完毕准备退出时执行,而且是必须执行的。
在进行异常捕获时,我们应该遵循“先处理小异常,再处理大异常”的原则,所以在@catch时我们应该将父类异常放在子类异常的后面,像NSException作为所有异常的根异常,应该放在最后处理。
3、如果程序需要在@catch块中访问异常对象的相关信息,则可以通过访问@catch后的异常形参来获得。当系统调用某个@catch块来处理该异常对象时,会将异常对象赋给@catch块后的异常参数,程序即可通过该参数来获得异常的相关信息。所有的异常对象都包含了如下几个常用方法,这几个方法都相当于getter方法,习惯上进场用点语法来获取这些信息。
- name:返回该异常详细的名称
- reason:返回引发该异常的原因
- userInfo:返回引发该异常的用户附加信息,该方法返回值是一个NSDictionary对象。
1 @try {
2 // 1
3 [self tryTwo];
4 }
5 @catch (NSException *exception) {
6 // 2
7 NSLog(@"%sn%@", __FUNCTION__, exception);
8 // @throw exception; // 这里不能再抛异常
9 }
10 @finally {
11 // 3
12 NSLog(@"我一定会执行");
13 }
14 // 4
15 // 这里一定会执行
16 NSLog(@"try");
17
18 //实例方法tryTwo
19 - (void) tryTwo
20 {
21 @try {
22 // 5
23 NSString *str = @"abc";
24 [str substringFromIndex:111]; // 程序到这里会崩
25 }
26 @catch (NSException *exception) {
27 // 6
28 // @throw exception; // 抛出异常,即由上一级处理
29 // 7
30 NSLog(@"%sn%@", __FUNCTION__, exception);
31 }
32 @finally {
33 // 8
34 NSLog(@"tryTwo - 我一定会执行");
35 }
36
37 // 9
38 // 如果抛出异常,那么这段代码则不会执行
39 NSLog(@"如果这里抛出异常,那么这段代码则不会执行");
40 }
为了方便大家理解,我在这里再说明一下情况: 如果6抛出异常,那么执行顺序为:1->5->6->8->3->4 如果6没抛出异常,那么执行顺序为:1->5->7->8->9->3->4 由于tryTwo方法中对@try中的异常都进行了处理,并没有继续向上一层调用它的函数抛出异常,所以第3行的方法调用并不会抛出异常,因此,5~9行的@catch块不会执行。
4、在某些时候,某些数据与业务规则不相匹配,系统无法抛出这类异常,如果需要再程序中自行抛出异常,则应使用@throw语句。@throw语句可以单独使用,@throw抛出的不是一个异常类,而是一个异常实例对象,而且每次只能抛出一个异常实例。大部分时候抛出NSException对象即可,在少部分时候,OC也允许程序员抛出自定义的异常类对象。自定义异常类和普通类的定义没有什么区别,唯一的一点要求就是必须继承自NSException父类。
1 //SomethingException的接口部分SomethingException.h,啥都没定义
2 #import <Foundation/Foundation.h>
3
4 @interface SomethingException : NSException
5
6 @end
7
8
9
10 //SomethingException实现部分SomethingException.m,非常简单
11 #import "SomethingException.h"
12
13 @implementation SomethingException
14
15 @end
此后,我们就可以使用SomethingException异常类来进行@throw或者@catch块中进行处理了。
- PHP7.0正式版编译安装升级及WordPress问题解决分享
- MySQL自增列的重复值问题(r12笔记第25天)
- 借助腾讯云CDN开启全站https及问题解决分享
- 分分钟搭建MySQL Group Replication测试环境(二)(r12笔记第41天)
- php5编译安装常见错误和解决办法集锦
- MySQL自增列主从不一致的测试(r12笔记第37天)
- 分享Mac/Linux系统Shell终端利器SecureCRT以及注册破解方法
- MySQL中GTID和自增列的数据测试(r12笔记第38天)
- 分享一个入门级可控多线程shell脚本方案
- PhalGo-介绍
- 实测Nginx服务器开启pagespeed加速效果
- MySQL频繁停库的问题分析(r12笔记第33天)
- 解决Nginx Helper插件一键清理缓存功能导致网站打不开问题
- Oracle 12c DBCA浅析(r12笔记第48天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AkShare-股票数据-终止和暂停上市股票
- AkShare-股票数据-股票列表
- AkShare-股票数据-板块详情
- AkShare-股票数据-板块行情
- AkShare-股票数据-流通股东
- SpringBoot系列之使用Spring Task实现定时任务
- AkShare-股票数据-分时数据
- AkShare-基金数据-基金行情数据
- AkShare-期权数据-商品期权
- AkShare-股票数据-破净股统计
- AkShare-股票数据-创新高和新低的股票数量
- AkShare-股票数据-A股个股市盈率、市净率和股息率
- AkShare-股票数据-A股市净率
- AkShare-股票数据-A股市盈率
- AkShare-期货数据-期货交易日历