Swift4.0复习错误处理
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 = 0 /// 实现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 < -10 { // 如果a的值小于-10, // 则抛出MyEnumError.errorOne throw MyEnumError.errorOne } else if a > 10 { // 如果a的值大于10, // 则抛出MyEnumError.errorTwo throw MyEnumError.errorTwo } else if a == 0 { // 如果a的值为0, // 那么抛出MyStructError对象, // 并且其errCode的值为-1 throw MyStructError(errCode: -1) } print("a = \(a)") return a }
3.错误捕获与处理:
“在Swift编程语言中我们使用 do-catch 块对错误进行捕获。”
摘录来自: “大话Swift 4.0”。 iBooks.
// 由于在以下语句中包含了对可抛出错误的函数调用, // 因此这里使用do语句块将这些调用围起来 do { // 对于任一可能会抛出错误的函数, // 在调用前面都必须添加try关键字 var value = try foo(a: -100) value += try foo(a: 100) value += try foo(a: 0) 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.