1.Swift中错误的表示:

“在Swift中如果我们要定义一个表示错误的类型非常简单,只需遵循 Error 协议即可。我们通常用枚举或结构体类型来表示错误类型,当然枚举可能用得更多些,因为它能更直观地表达当前错误类型的每种错误细节。”

摘录来自: “大话Swift 4.0”。 iBooks.

  1. /// 定义一个枚举类型的错误类型
  2. enum MyEnumError: Error {
  3. case errorOne
  4. case errorTwo
  5.  
  6. /// 实现Error协议的localizedDescription只读实例属性
  7. var localizedDescription: String {
  8. let desc = self == .errorOne ? "the first errror" : "the second error"
  9. return "\(self): \(desc)"
  10. }
  11. }
  12.  
  13. /// 定义一个结构体类型的错误类型
  14. struct MyStructError: Error {
  15. var errCode: Int =
  16.  
  17. /// 实现Error协议的localizedDescription只读实例属性
  18. var localizedDescription: String {
  19. return "The error code is: \(errCode)"
  20. }
  21. }
  22.  
  23. print("The enum error is: \(MyEnumError.errorOne.localizedDescription)")
  24.  
  25. print("The struct error is: \(MyStructError().localizedDescription)")

2.Swift中的错误抛出:

  1. “在一个函数或方法中可能要抛出一个错误,
  2. 那么我们必须在该函数的形参列表后面,
  3. 返回类型前面(即 -> 之前)添加 throws 关键字,以显式告诉编译器,
  4. 当前函数可能会抛出错误。”
  5.  
  6. 摘录来自: “大话Swift 4.0”。 iBooks.
  1. /// 因此这里用throws限定。
  2. /// 注意throws的位置
  3. func foo(a: Int) throws -> Int {
  4. if a < - {
  5. // 如果a的值小于-10,
  6. // 则抛出MyEnumError.errorOne
  7. throw MyEnumError.errorOne
  8. }
  9. else if a > {
  10. // 如果a的值大于10,
  11. // 则抛出MyEnumError.errorTwo
  12. throw MyEnumError.errorTwo
  13. }
  14. else if a == {
  15. // 如果a的值为0,
  16. // 那么抛出MyStructError对象,
  17. // 并且其errCode的值为-1
  18. throw MyStructError(errCode: -)
  19. }
  20.  
  21. print("a = \(a)")
  22.  
  23. return a
  24. }
  25.  

3.错误捕获与处理:

“在Swift编程语言中我们使用 do-catch 块对错误进行捕获。”

摘录来自: “大话Swift 4.0”。 iBooks.

  1. // 由于在以下语句中包含了对可抛出错误的函数调用,
  2. // 因此这里使用do语句块将这些调用围起来
  3. do {
  4. // 对于任一可能会抛出错误的函数,
  5. // 在调用前面都必须添加try关键字
  6. var value = try foo(a: -)
  7. value += try foo(a: )
  8. value += try foo(a: )
  9.  
  10. print("value = \(value)")
  11. } // 下面紧接着使用catch语句块
  12. catch let err {
  13. // 如果在do语句块中有任一错误抛出,
  14. // 那么即会执行此catch语句块中的内容
  15. print("err is: \(err)")
  16. }
  17.  
  18. // 无论上面do语句块是否有错误,
  19. // 这句打印均会执行
  20. print("complete")

4.rethrows修饰的函数和方法:

5.将错误转换为可选值:

6.指定清理行为:

defer语句块

  1. func test() {
  2.  
  3. // 编写第一个defer语句块
  4. defer {
  5. print("First defer!")
  6. }
  7.  
  8. print("First stage!")
  9.  
  10. // 编写第二个defer语句块
  11. defer {
  12. print("Second defer!")
  13. }
  14.  
  15. print("Second stage!")
  16.  
  17. // 编写最后一个defer语句块
  18. defer {
  19. print("Last defer!")
  20. }
  21.  
  22. print("Last stage!")
  23. }
  24.  
  25. // 这里函数调用执行之后输出:
  26. // First stage!
  27. // Second stage!
  28. // Last stage!
  29. // Last defer!
  30. // Second defer!
  31. // First defer!
  32. test()

7.Never修饰的函数:

“当一个函数在执行后不会返回时,我们用 Never 作为该函数的返回类型,表示该函数不能返回。”

摘录来自: “大话Swift 4.0”。 iBooks.

“如果我们程序因为某些状态而导致只能做崩溃或退出处理,那么我们可以调用一个不能返回的函数来抛出错误或直接退出。还有就是当前函数执行一个不断接收消息并分发消息的无限循环,该函数将永不退出”。

摘录来自: “大话Swift 4.0”。 iBooks.

Swift4.0复习错误处理的更多相关文章

  1. Swift4.0复习特性、编译标志和检查API的可用性

    1.Swift中的特性: @引出,后面紧跟特性名,圆括号带参数即可. @attribute(args) avaiable: 指明对象,函数,类型的可用性. @available(iOS 10.0, m ...

  2. Swift4.0复习访问控制与作用域

    1.访问等级: open: 可以继承,可以重写. public: “public 访问等级能用于修饰所有文件作用域的函数.对象.协议.枚举.结构体.类以及各种类型中的属性与方法.用 public 所修 ...

  3. Swift4.0复习扩展

    1.扩展计算式属性: 2.对方法进行扩展: /// 定义枚举类型Light, /// 它指定了基本类型String enum Light: String { case red = "red& ...

  4. Swift4.0复习类型定义、类型投射等操作

    1.类型定义: /// 这里将MyInt定义为Int32类型 typealias MyInt = Int32   /// 这里将MyArrayInt定义为[MyInt]数组类型 typealias M ...

  5. Swift4.0复习类

    1.类的属性: 2.类的方法: 3.类作为引用类型: “Swift新增了一对操作符 === 与 !== 用于判定同一个类的两个对象引用是否指向同一对象实例.” 摘录来自: “大话Swift 4.0”. ...

  6. Swift4.0复习协议

    1.协议的定义: /// 定义一个协议MyProt protocol MyProt {   /// 声明了一个实例方法foo, /// 其类型为:() -> Void func foo()   ...

  7. Swift4.0复习结构体

    1.基本语法: /** 定义了一个结构体 */ struct Structure {   /// 一个常量存储式实例属性, /// 并直接为它初始化 let constProperty =   /// ...

  8. Swift4.0复习枚举

    1.枚举类型: “Swift编程语言中,枚举类型属于值类型,而不是引用类型.” 摘录来自: “大话Swift 4.0”. iBooks. 2.枚举类型和枚举对象的定义: enum Enumeratio ...

  9. Swift4.0复习闭包

    1.闭包的定义和调用: _ = { (param1: Int, param2: Float, param3: Void) -> return_type in // 闭包执行代码 /* ... * ...

随机推荐

  1. (尚012)Vue表单数据的自动手集(表单数据提交,需要收集表单数据)

    自动收集,就是我一输入数据,就自动收集,等我点击提交按钮的时候,数据就收集好了 1.使用v-model对表单数据自动收集 1)text/textare----单行/多行输入框 2)checkbox-- ...

  2. C# 线程小结

    进程与线程 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源. 而一个进程又是由多个线程所组成的. 什么是线程? 线程是程序中的一个执行流,每个线 ...

  3. 课标2-2-1-3 :MMU配置与使用

    void create_page_table(void){ unsigned long *ttb = (unsigned long *)0x20000000; unsigned long vaddr, ...

  4. copy()函数技术推演

    /*** str_copy.c ***/ #include<stdio.h> void copy_str21(char *from, char *to) { for(; *from != ...

  5. wpf防止界面卡死

    AsyncInvokeHelper.CallbackInvoke(new Action(() => { System.Threading.Tasks.Task.Factory.StartNew( ...

  6. linux 命令scp

    scp命令网络传输文件 上传文件 scp 文件名 usename@10.233.23.100:Data/ 上传文件夹到服务器 scp -r 文件夹(不带/)usename@10.233.23.100: ...

  7. 深度学习面试题21:批量归一化(Batch Normalization,BN)

    目录 BN的由来 BN的作用 BN的操作阶段 BN的操作流程 BN可以防止梯度消失吗 为什么归一化后还要放缩和平移 BN在GoogLeNet中的应用 参考资料 BN的由来 BN是由Google于201 ...

  8. arcpy 重分类

    arcpy.gp.Reclassify_sa("dem.tif","Value","0 2000 1;2000 2100 2;2100 2500 3; ...

  9. WebSocket——SuperWebSocket实现服务端和客户端

    WebSocket——SuperWebSocket实现服务端和客户端具体实现如下: 注:本作者是基于vs2019 enterprise版本,所有项目均为.Net Framwork4.7版本(因为Web ...

  10. 回声消除(AEC)原理

    一.前言 因为工作的关系,笔者从2004年开始接触回声消除(Echo Cancellation)技术,而后一直在某大型通讯企业从事与回声消除技术相关的工作,对回声消除这个看似神秘.高端和难以理解的技术 ...