创建: 2018/03/24

更新: 2018/06/05 补充catch可以只带where不带模式

【任务表】TODO

异常处理语法
 异常的发生

抛出例外

thorw 式

抛出的值的类型必须采用Error协议, 定义可抛出函数时不用声明抛出值类型(同一个函数内也可以抛出不同类型的)

是空协议

public protocol Error {
} extension Error {
}

抛出值的类型的例

enum SampleError1: Error { // 抛出值类型的例
case asSimpleResultA, asSimpleResultB
case asString(String)
case asNumer(Int)
}

● 声明可能抛出异常的函数, 在参数表(...)后面加上throws

// throws 记在参数表 [()] 后面, 返回值 [ -> 类型] 前面

func sample() thorws // 不带参数和返回值

func sample(a: Int, b: Int) throws // 不带返回值

func sample(mode: Mode) throws -> Bool // 带参数和返回值

● 声明可能抛出异常的构造函数

init(...) throws // 和函数一样, 只不过构造函数不写返回值
 异常的传播与捕捉 

遇到抛出异常, 一层层往上抛, 直到遇到可以catch自己的catch

● 呼出可抛出异常的函数的, 如果能catch所有可能的异常就是普通函数

如果不能catch, 则自身也是可抛出异常的函数. 要带throws

 呼出会抛出异常的函数的方法 

呼出会抛出异常的都必须带try

try 可抛出异常的函数

没有异常则和平常一样, 抛出异常则往上一次抛.

这么呼出的, 自身也是抛出异常的函数

● do-catch

do {
...
try 可抛出异常的函数
...
} catch {
...
}

catch所有可能的错误的话, 自身是普通函数。否则为会抛出异常的函数

● try?

没有异常返回正常返回值, 异常返回nil

少用, 不好确定错误

● try!

相当于作为不会抛出异常的函数来呼出

发生异常程序停止, 尽量不用

 do-catch
do {
...
try ... # 呼出会抛出异常的函数/构造函数
...
} catch pattern where ... { // pattern和where都可以省略, 可以只有pattern或者where
...
} catch ... { // catch可以有多个
...
} catch { // 最后一个接上面都不匹配的
...
}

● 不带默认( catch {...} ) 的则不匹配往外throw错误

不带默认的catch内部用error来获取错误

 try?与try! 

● try?

没抛出错误则和普通函数一样, 发出错误则为nil.

返回型为T的, 用try则返回T?

用法:

if let result = try? getReslt(mode: Mode.sample) { # if-let
...
}

● try!

没抛出错误和普通函数一样, 抛出错误则程序报错并停止运行

 会抛出错误的可选型函数与try?  返回值为T??型
   
终止处理与收尾处理
   
   
   
   
   
   
   
   
   
   
访问控制
   
   
   
   
   
   
   
   
   
   
断言(assertion)与测试
   
   
   
   
   
   
   
   
   
   
可利用条件与预处理控制
   
   
   
   
   
   
   
   
   
   
实例的序列化
 概念

把数据转为比特列 serialize / encode(特指内容方面) / archive(存入文件为目的)

比特列转为数据: deserialize / decode / unarchive

 协议

序列化 Encodable

必须方法

 

func encode(to: Encoder) throws

● 参数需要采用了Encoder协议

   
 解序列化 Decodable

必须方法

 

init(from: Decoder) throws

● 参数需要采用了Decoder协议

   
   
 Codable

typealias Codable = Decodalbe & Encodable

Swift的基本数据类型(Int, String等)都采用了Codable

基本数据类型为元素的数组,哈希表,集合等也采用了Codable

构造体的所有容纳型属性都采用Codable的话, 此构造体也可以直接采用Codable 

struct Samle: Codable {
var sample: [Int] {
return []
}
}
   
   
   
   
   
   
   
   
   
   

最新文章

  1. pthread 学习
  2. [Outlook] Outlook2013能收但无法发送邮件-0x800CCC13, 0x800CCC0B, 0x8004210B
  3. perl 脚本测试
  4. (转)使用Migrations更新数据库结构(Code First )
  5. 【七】注入框架RoboGuice使用:(Your First Custom Binding)
  6. nginx新手入门
  7. 必应词典--英语学习APP案例分析
  8. java导出word
  9. mysql-16进制、十进制互转
  10. arcgis api 3.x for js 入门开发系列十叠加 SHP 图层(附源码下载)
  11. Jenkins结合.net平台工具之ReportGenerator
  12. Spark新手入门——1.Scala环境准备
  13. 详解Linux查看实时网卡流量的几种方式(转)
  14. Tornado实现多线程、多进程HTTP服务
  15. JS 实现日期信息增加年数,月数,天数
  16. 20145234黄斐《网络对抗技术》实验八、Web基础
  17. 学习KNN
  18. Nginx安装及配置文件解释
  19. atitit.seo 发帖关键词以及链接的制作.doc
  20. SSH三大框架的知识题

热门文章

  1. POJ 2749 2SAT判定+二分
  2. PAT (Advanced Level) 1031. Hello World for U (20)
  3. 如何使用sqlalchemy获取某年某月的数据总和
  4. python执行系统命令的几种方法
  5. 跟着9张思维导图学JavaScript
  6. libpython2.7.so.1.0: cannot open shared object file: No such file or directory
  7. Linux 命令 sudo
  8. Fp关联规则算法计算置信度及MapReduce实现思路
  9. MySQL基础笔记(六) 存储过程与函数
  10. HDU 1824 Let's go home (2-SAT判定)