17:swift-错误处理
正文
/* 17:错误处理 1:处理错误 当一个错误被抛出,周围的某些代码必须为处理错误响应 ——比如说,为了纠正错误,尝试替代方案,或者把错误通知用户 */ import UIKit class Error17VC: UIViewController { var a = 0 func test() { a = 0 // 5: defer:defer中的代码将延迟至当前作用域结束之前执行 // defer { a = 1 } a = 2 } func test1() { print("test1") } func test2() { print("test2") } func test3() { print("test3") } //6、多个defer,执行顺序与定义顺序相反 压栈操作,最后执行的位于栈顶,先释放 func testDefer() { defer { test1() } defer { test2() } defer { test3() } } override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .white self.title = "17:错误处理" test() print("a=\(a)") //6、多个defer,执行顺序与定义顺序相反 testDefer() testOptionalError() do { // let a = try testError(index: 201) // let a = try testError(index: 200) let a = try testError(index: 199) // let a = try testError(index: -1) print(a) } catch ValueError.ValueErrorOutOfMax { print("超出最大界限") } catch ValueError.ValueErrorOutOfBounds { print("超出界限") } catch ValueError.ValueErrorOutOfMin { print("超出最小界限") } catch { print("未知错误") } } /*2: 抛出错误:错误里没有堆栈信息 wift 中的错误处理, try, catch 和 throw 的使用与其他语言中的异常处理很相仿。 不同于许多语言中的异常处理——包括 Objective-C ——Swift 中的错误处理并不涉及调用堆栈展开,一个高占用过程。 因此, throw 语句的性能特征与 return 比不差多少。 */ public func testError(index: Int) throws -> Int { if index > 200 { // 有返回值的时候,不需要return throw ValueError.ValueErrorOutOfMax } else if index == 200 { throw ValueError.ValueErrorOutOfBounds } else if index < 0 { throw ValueError.ValueErrorOutOfMin } else { return index } } /* 3: 错误可选项 转换错误为可选项 使用 try?通过将错误转换为可选项来处理一个错误。如果一个错误在 try?表达式中抛出,则表达式的值为 nil。 比如说下面的代码x和y拥有同样的值和行为: */ func someThrowingFunction(_ index: Int) throws -> Int { if index < 0 { throw ValueError.ValueErrorOutOfMin } return index } // 如果 someThrowingFunction()抛出一个错误, x和 y的值就是 nil。 func testOptionalError() { let x = try? someThrowingFunction(20) let y: Int? do { y = try someThrowingFunction(20) } catch { y = nil } // 4: 取消错误传递 try! var a = 10 if (a > 0) { let b = try! someThrowingFunction(a) print("取消错误传递:\(b)") } } // defer:defer中的代码将延迟至当前作用域结束之前执行 } enum ValueError: Error { case ValueErrorOutOfBounds case ValueErrorOutOfMax case ValueErrorOutOfMin }