Swift 2.0 异常处理
转自:http://www.jianshu.com/p/96a7db3fde00
WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法。这篇文章会主要围绕这个方面进行讨论。
如何建造异常类型?
在 iOS 开发当中,我们会面对很多异常处理。在 Cocoa Touch 中我们使用 NSError 来进行异常处理。在新的 Swift 2.0 中,我们可以使用新的 ErrorType protocol。
在 Swift 中, enum 是最好的方法建立属于你自己的异常类型,你只要在你的 enum 中确认新的 ErrorType。
enum MyError: ErrorType {
case NotExist
case OutOfRange
}
如何抛出异常
在抛出异常之前,我们需要在函数或方法的返回箭头 -> 前使用 throws 来标明将会抛出异常
func myMethodRetrunString() throws -> String
// No return, we can just add throws in the end
func myMethodRetrunNothing() throws
声明之后, 我们需要在函数或者方法里扔出异常,很简单使用throw 就可以了
func myMethod() throws
//...
// item is an optional value
guard let item = item else {
// need throws the error out
throw MyError.NotExist
}
// do with item
}
上面这段代码使用了 guard 来进行unwrap optional value。这是 Swift 2.0 提供的一个新的方法。
Guard
在 Haskell, Erlang 等语言中早已存在 guard, 在这里有更多关于它的介绍。
guard 翻译过来可以理解为守护,守卫。
在 Swift 中,guard 有点像 if 但是他们有两个非常重要的区别
guard必须强制有else语句- 只有在
guard审查的条件成立,guard之后的代码才会运行 (像守卫一样,条件不符就不让过去)。
guard 中的 else 只能执行转换语句,像 return, break, continue 或者 throws 当然你也可以在这里返后一个函数或者方法。
值得注意的是,guard的使用会提高你代码的可读性,但是也代表你的代码的执行会有非常明确的顺序性,这一点需要开发者们留心处理。
虽然我们在异常处理中提到了 guard 但是不代表它只能在异常处理中使用。它具有广泛的适用性,或许过阵子我会专门为 guard的使用写篇文章。
如何获取并处理异常?
上文讲述了如何建造抛出异常,获取和处理异常就变得很简单了。使用 do-catch 机制。
do {
try functionWillThrowError()
} catch {
// deal with error
}
do-catch 机制简单易懂。很多编程语言也使用类似的机制进行异常处理,但是在 Swift 中有一个比较重要的特性。
catch 和 switch 一样具有 Pattern Matching 的能力。所以,使用 catch 你可以对异常的解析进行更为高级的处理
do {
try functionWillThrowError()
} catch MyError.NotExist {
// deal with not exist
} catch MyError.OutOfRange {
// deal with not exist
}
这里值得提一下在 Swift 2.0中一个跟异常处理没有关系的改进
Swift 2.0 中没有了
do-while循环,取而代之的是repeat-while。苹果说这个改动是为了增强代码的可读性。但是我更觉得是为了让我们更舒服的使用do-catch
不处理异常
如果我不想处理异常怎么办,或者说,我非常确定某个方法或者函数虽然声明会抛出异常,但是我自己知道我在使用时候是绝对不会抛出任何异常的。这种情况下 我们可以使用 try!
try! functionThrowErrorNil()
当然,如果你使用 try!,而你的方法或者函数抛出了异常,那么你会得到一个运行中异常 (runtime error) 所以我们开发者需要慎用哦。
Defer
文章结束前我们再讨论下 defer
在你的代码块就要结束前。如果你使用了 defer。 在其之中的代码就会运行。等于说,给了你最后的机会来进行一些处理。如果你熟悉 BDD 或者 TDD, 那么你可以参考他们中的 aferAll 机制
文/阮超(简书作者)
原文链接:http://www.jianshu.com/p/96a7db3fde00
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 func myFunction() throws {
defer {
// No matter what happened I need do something
print("All done, clean up here")
}
guard let item = item else {
// need throws the error out
throw MyError.NotExist
} guard item.count > maxNumber else {
// need throws the error out
throw MyError.OutOfRange
} // do something with item
// ...
}
注意,如果你有多个
defer语句,他们在执行的顺序会和栈一样,最后一个进,第一个出。
总结
- 使用
ErrorType的帮助建立你的异常类型 - 使用
throws来声明异常,用throw来抛出异常 - 使用
do-catch机制来获取和处理异常
Swift 2.0 异常处理的更多相关文章
- iOS开发——新特性Swift篇&Swift 2.0 异常处理
Swift 2.0 异常处理 WWDC 2015 宣布了新的 Swift 2.0. 这次重大更新给 Swift 提供了新的异常处理方法.这篇文章会主要围绕这个方面进行讨论. 如何建造异常类型? 在 i ...
- Swift 2.0初探
转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引 ...
- Swift 2.0 到底「新」在哪?
[编者按]2015年6月,一年一度的苹果 WWDC 大会如期而至,在大会上苹果发布了 Swift 2.0,引入了很多新的特性,以帮助开发者更快.更简单地构建应用.本篇文章作者是 Maxime defa ...
- iOS开发——新特性OC篇&Swift 2.0新特性
Swift 2.0新特性 转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度 ...
- Swift 2.0初探:值得注意的新特性
转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...
- 关于 Swift 2.0 - 语言新特性与革新
随着刚刚结束的 WWDC 2015 苹果发布了一系列更新,这其中就包括了令人振奋的 Swift 2.0. 这是对之前语言特性的一次大幅的更新,加入了很多实用和方便的元素,下面我们就一起来看看这次更新都 ...
- iOS开发系列--Swift 3.0
概述 从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行 ...
- Swift 3.0 【Swift 3.0 相较于 Swift 2.2 的变化】
一.编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须指定参数名 在Swift的历史版本中出现过在调用函数时不需要指定任何函数参数(或者从第二个参数开始指定参数名),在调用方法时 ...
- Swift 2.x -> Swift 3.0
Swift 3.0 相对于 2.x 有很大变化.特别是因为命名习惯的改变,导致许多 Api 都发生了变化.总的趋势是让表示更简洁. 对旧的代码升级,大部分可以根据提示来进行更正.但也有的需要手动修改. ...
随机推荐
- Bean熟悉替换,只替换部分属性,其他属性值不改变
Bean熟悉替换,只替换部分属性,其他属性值不改变 需要加入:asm.jar cglib-2.1.jar,用来map和bean之间的转换(比spring和反射的效率好,因为加入了缓存) packag ...
- mutation annovar
1.annovar 很全面 http://annovar.openbioinformatics.org: 2.http://blog.goldenhelix.com/:
- Mac 下 PostgreSQL 的安装与使用
在 mac 下,可以利用 homebrew 直接安装 PostgreSQL: 1 brew install postgresql -v 稍等片刻,PostgreSQL 就安装完成.接下来就是初始数据库 ...
- JSON生成c#类代码小工具
JSON生成c#类代码小工具 为什么写这么个玩意 最近的项目中需要和一个服务端程序通讯,而通讯的协议是基于流行的json,由于是.net,所以很简单的从公司代码库里找到了Newtonsoft.dll( ...
- Openfire on Centos7
学习一下linux,装备 1)centos 最小安装.(找抽的节奏) 2)必备 oepnssh yum install openssh-server.x86_64 3)配置网络.打开 /etc/sys ...
- 【开园 and 计划】
开园 啊啊啊啊啊啊啊啊,郁闷啊,头一回写博客,一刻钟前保存的草稿为何荡然无存??? 那少废话直击要点:今日乃我开园之日,开园为了改变.为了学习.为了积累. 计划 最长为时 3月,截止到 2016年9月 ...
- Java抛出OutOfMemoryError:Java heap space堆内存溢出错误的分析方案
抛出堆内存溢出的错误一定要记得保留现场环境(导出堆内存信息到文件),否则如果无法进行分析,并从根本上解决问题,下次很有可能还会出现. 第一步:导出堆转储文件 我们可以使用Jdk自带的jmap工具.使用 ...
- Jmeter 学习(三)
1. 线程组知识 1)Ramp-up period 表示多长时间内建立全部的线程数N 默认为0,表示测试开始即建立全部线程并立即发送访问请求 设置为Ts,表示每隔T/N建立一个线程 注1:一般不设置为 ...
- 正确使用ng-if和ng-show
在使用bootstrap中,我们会经常用到按钮组,也就是btn-group,如果仔细观察的话,会发现一个按钮组的第一个和最后一个按钮分别是有圆角的,如下图: 但是中间的按钮是没有圆角的,这样显得比较美 ...
- ECMAScript数组常用
var arr = [22, 33, 44, 55, 66, 77, 88, 99]; //every 全部结果为true 则返回true var e = arr.every(function (m) ...