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对象。
@try {
//
[self tryTwo];
}
@catch (NSException *exception) {
//
NSLog(@"%s\n%@", __FUNCTION__, exception);
// @throw exception; // 这里不能再抛异常
}
@finally {
//
NSLog(@"我一定会执行");
}
// 4
// 这里一定会执行
NSLog(@"try"); //实例方法tryTwo
- (void) tryTwo
{
@try {
//
NSString *str = @"abc";
[str substringFromIndex:]; // 程序到这里会崩
}
@catch (NSException *exception) {
// 6
// @throw exception; // 抛出异常,即由上一级处理
//
NSLog(@"%s\n%@", __FUNCTION__, exception);
}
@finally {
//
NSLog(@"tryTwo - 我一定会执行");
} // 9
// 如果抛出异常,那么这段代码则不会执行
NSLog(@"如果这里抛出异常,那么这段代码则不会执行");
}为了方便大家理解,我在这里再说明一下情况:
如果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父类。
//SomethingException的接口部分SomethingException.h,啥都没定义
#import <Foundation/Foundation.h> @interface SomethingException : NSException @end //SomethingException实现部分SomethingException.m,非常简单
#import "SomethingException.h" @implementation SomethingException @end
此后,我们就可以使用SomethingException异常类来进行@throw或者@catch块中进行处理了。
OC学习8——异常处理的更多相关文章
- oc学习笔记2
.oc中的BOOL类型 oc中的BOOL类型的值为YES和NO,有点小奇怪 在oc中YES不等于1,但是NO一定等于0,所以不要把1和YES来比较 .消息发送 在oc中,经常使用这样的术语:将allo ...
- OC学习总结之面向对象和类
OC学习总结之面向对象和类 Objective-c是c语言的母集合,它的原意就是在原始的c语言的主体上加入面向对象的特性.1.面向对象和面向过程 面向对象和面向过程是编程的两种思考方式.面向对象 ...
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- OC学习16——对象归档
转载自 OC学习篇之---归档和解挡 OC中的归档就是将对象写入到一个文件中,Java中的ObjectInputStream和ObjectOutputStream来进行操作的.当然在操作的这些对象都 ...
- OC学习11——循环引用与@class
转载自 OC学习篇之---@class关键字的作用以及#include和#import的区别 一.#import和#include的区别 当我们在代码中使用两次#include的时候会报错:因为#in ...
- OC学习9——反射机制
1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...
- OC学习6——面相对象的三大特性
我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息 ...
- OC学习5——类和对象
1.OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类.成员变量和方法的基本功能.类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的 ...
- OC学习篇之---总结和学习目录
今天终于把OC的基础知识学习完了,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.下面就是这次学习OC的目录教程,如果大家发现有什么不正确的地方,请指正,小弟是新生 ...
随机推荐
- CocoaPods 安装及使用
1.开启 terminal 2.移除现有 Ruby 默认源 $ gem sources --remove https://rubygems.org/ 3.使用新的源 $ gem sources -a ...
- 【爬虫】利用Scrapy抓取京东商品、豆瓣电影、技术问题
1.scrapy基本了解 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取(更确切来说,网络抓 ...
- pyqt5实现注册界面
__author__ = 'sign_in' import sys from PyQt5.QtGui import QPixmap from PyQt5.QtWidgets import * clas ...
- SpringMVC 视图解析器
SpringMVC 视图解析器 还记得SpringMVC 快速入门中,dispatcher-servlet.xml 配置的视图解析器么.它是SpringMVC 的核心知识点.本章节比较简单,明白视图解 ...
- JavaScript学习笔记(十四)——对象
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- 数细胞-swust oj
数细胞(0964) 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.编程需要用到的队列及其相关函数已经实现,你只需要完 ...
- android扫描网页二维码进行网页登录
转载请标明出处: http://www.cnblogs.com/dingxiansen/: 本文出自:丁先森-博客园 周六和朋友去网吧开黑,开机打开TGP,朋友那边开始输入账号密码,我看了他一眼low ...
- [WPF]本地化入门
1. 前言 WPF的本地化是个很常见的功能,我做过的WPF程序大部分都实现了本地化(不管最终有没有用到).通常本地化有以下几点需求: 在程序启动时根据CultureInfo.CurrentUICult ...
- HDU 5504 GT and sequence 模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5504 思路:模拟 代码: #include<stdio.h>//------杭电5504 ...
- 如果Centos没有桌面,怎么修改IP地址
修改前备份!!! 修改前备份!!! 修改前备份!!! [PHP] 纯文本查看 复制代码 ? 1 vi /etc/sysconfig/network-scripts/ifcfg-eth0 编辑,输入以下 ...