1.Swift中错误的表示:

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

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

/// 定义一个枚举类型的错误类型
enum MyEnumError: Error {
case errorOne
case errorTwo
 
/// 实现Error协议的localizedDescription只读实例属性
var localizedDescription: String {
let desc = self == .errorOne ? "the first errror" : "the second error"
return "\(self): \(desc)"
}
}
 
/// 定义一个结构体类型的错误类型
struct MyStructError: Error {
var errCode: Int =
 
/// 实现Error协议的localizedDescription只读实例属性
var localizedDescription: String {
return "The error code is: \(errCode)"
}
}
 
print("The enum error is: \(MyEnumError.errorOne.localizedDescription)")
 
print("The struct error is: \(MyStructError().localizedDescription)")

2.Swift中的错误抛出:

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

3.错误捕获与处理:

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

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

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

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

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

6.指定清理行为:

defer语句块

func test() {
 
// 编写第一个defer语句块
defer {
print("First defer!")
}
 
print("First stage!")
 
// 编写第二个defer语句块
defer {
print("Second defer!")
}
 
print("Second stage!")
 
// 编写最后一个defer语句块
defer {
print("Last defer!")
}
 
print("Last stage!")
}
 
// 这里函数调用执行之后输出:
// First stage!
// Second stage!
// Last stage!
// Last defer!
// Second defer!
// First defer!
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. input图片上传并显示查看判断图片类型

    有一个问题:上传一次在上传一次关闭按钮会出现两次,关闭之后还有一个(改好了可以告诉我我在修正过来) <div id="box"> <div class=" ...

  2. RookeyFrame 加载 自定义JS

    注意JS存放的位置:是在model文件夹下的某某文件夹!!! 线上添加的模块: 1.JS文件名:和表名一致 2.JS目录:Rookey.BusSys.Web\Scripts\model\TempMod ...

  3. mac 安装 报错 "/usr/local/include/stdint.h:2:10: error: #include nested too deeply"

    报错详细信息 构建错误 - “#include嵌套太深” /usr/local/include/stdint.h:2:10: error: #include nested too deeply #in ...

  4. linux ftp启用和停用及vsftpd安装 ssh 启用和停用命令及ssh的安装

    1.首页要用ftp:服务器上必须安装vsftpd 安装命令 yum installed vsftpd 查看vsftpd是否启动 root@DK:/home/daokr# service vsftpd ...

  5. zabbix 内置key说明

    原文参考:https://blog.csdn.net/whs_321/article/details/52939263 一.简介 Zabbix 内置了很多丰富的key,使得我们在添加linux os模 ...

  6. python模块之psutil

    一.模块安装 1.简介 psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息. ...

  7. (14)打鸡儿教你Vue.js

    重构 "代码重构" 为什么要进行重构 提高代码的可读性和可维护性 代码中存在着重复的代码 存在过大的类或过长的方法 强依赖.紧耦合的结构 运算逻辑难以理解 代码不能清晰 统一的编码 ...

  8. webbench 源代码

    WebBench源码:https://github.com/EZLippi/WebBench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问 ...

  9. 使用flexmark将MarkDown转为HTML

    引入对应的依赖 <!-- https://mvnrepository.com/artifact/com.vladsch.flexmark/flexmark --> <dependen ...

  10. Hadoop hadoop 之hdfs数据块修复方法

    hadoop 之hdfs数据块修复方法: .手动修复 hdfs fsck / #检查集群的健康状态 hdfs debug recoverLease -path 文件位置 -retries 重试次数 # ...