如何建造异常类型?

在 iOS 开发当中,我们会面对很多异常处理。在 Cocoa Touch 中我们使用 NSError 来进行异常处理。在新的 Swift 2.0 中,我们可以使用新的 ErrorType protocol。

在 Swift 中, enum 是最好的方法建立属于你自己的异常类型,你只要在你的 enum 中确认新的 ErrorType

enum MyError: ErrorType {  case NotExistcase 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 valueguard let item = item else {// need throws the error outthrow 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 中有一个比较重要的特性。

catchswitch 一样具有 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 机制

func myFunction() throws {  defer {// No matter what happened I need do somethingprint("All done, clean up here")}guard let item = item else {// need throws the error outthrow MyError.NotExist}guard item.count > maxNumber else {// need throws the error outthrow MyError.OutOfRange}// do something with item// ...
}

注意,如果你有多个defer 语句,他们在执行的顺序会和栈一样,最后一个进,第一个出。

总结

  • 使用 ErrorType 的帮助建立你的异常类型
  • 使用 throws 来声明异常,用 throw 来抛出异常
  • 使用 do-catch 机制来获取和处理异常

Swift 异常处理相关推荐

  1. Swift - 异常处理

    Swift - 异常处理 参考文章: (1)Swift - 异常处理 (2)https://www.cnblogs.com/junhuawang/p/6231084.html 备忘一下.

  2. Swift 异常处理

    前言 在 Swift 1.0 时代是没有异常处理和抛出机制的. 如果要处理异常,要么使用 if else 语句或 switch 语句判断处理. 要么使用闭包形式的回调函数处理. 再要么就使用 NSEr ...

  3. Swift41/90Days - 面向轨道编程 - Swift 中的异常处理

    问题 在开发过程中,异常处理算是比较常见的问题了. 举一个比较常见的例子:用户修改注册的邮箱,大概分为以下几个步骤: 接收到一个用户的请求:我要修改邮箱地址 验证一下请求是否合法,将请求进行格式转化 ...

  4. swift抛出异常_swift之异常处理

    官网地址:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_La ...

  5. 你需要知道的有关Selenium异常处理的都在这儿

    什么是异常? 顾名思义,作为程序员的一种常用术语,"异常"与任何特定的编程语言无关.它属于程序因为突然中止,而未能交付出预期输出的事件.通常,引发异常出现的潜在因素往往来自如下方面 ...

  6. Swift反射API及其用法

    尽管 Swift 一直在强调强类型.编译时安全和静态调度,但它的标准库仍然提供了反射机制.可能你已经在很多博客文章或者类似Tuples.Midi Packets和Core Data的项目中见过它.也许 ...

  7. Swift互用性:采用Cocoa设计模式(Swift 2.0版)-b

    本页包含内容: 委托(Delegation) 错误处理(Error Handling) 键值观察(Key-Value Observing) Target-Action模式(Target-Action) ...

  8. Swift 烧脑体操(五)- Monad

    前言 \\ Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说 ...

  9. Swift 2.0初探:值得注意的新特性

    转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上A ...

最新文章

  1. 300. Longest Increasing Subsequence
  2. iOS开发③UIView
  3. c++ opencv 通道转换
  4. poj 2151 Check the difficulty of problems
  5. C++静态多态(模版模拟多态)的讨论
  6. XCTF-MISC-新手区-base64stego
  7. 【OpenGL】顶点变换常用函数总结
  8. python switch语句的多种实现方法
  9. 【Objective-C】08-self关键字
  10. mysql 指定驱动表_了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表
  11. 2018年的安卓开发环境搭建
  12. 【195】apache2.4安装ssl 证书
  13. html顺序播放mp3,完美:按顺序播放mp3的方法是什么?如何更改U盘中歌曲的播放顺序...
  14. excel组合汇总_Excel汇总20150112
  15. 百度图片爬虫【图片编码处理】
  16. SpringBoot拦截器或过滤器中使用流读取参数后,controller中注解读取不到参数
  17. Attention中的Q、K、V
  18. 2021年团体程序设计天梯赛-总决赛 L3-2 还原文件
  19. java调用word模板文件_Java使用模板导出word文档
  20. 如何修改图片的dpi?教你一招快速修改照片dpi的方法

热门文章

  1. 宏基因组文章目录(9月1日更新)
  2. R语言把dataframe数据转化为tibble格式、查看每个数据列的缺失值个数、使用数据列的均值对数据列的缺失值进行填充
  3. pandas使用drop_duplicates函数基于subset参数指定的数据列子集删除重复行、并设置keep参数保留重复行中的最后一个数据行
  4. R语言使用knitr生成机器学习模型全流程步骤示例:knitr与自动化结果报告、knitr常用参数
  5. R语言vtreat包自动处理dataframe的缺失值并生成对应的数据列_isbad来指示数据的原始缺失情况、查看特定字段缺失的那些数据行、查看数据集中多个字段的均值
  6. python可视化lassocv特征筛选之后的特征的相关性分析热力图
  7. R语言基于线性回归(Linear Regression)进行特征筛选(feature selection)
  8. android 无埋点 简书,无埋点README
  9. java生成sql语句_java生成SQL语句
  10. MySQL安装查看密码修改密码