iOS --- 错误处理部分(swift2.3)
来源:互联网 发布:金牛奇迹for mac 编辑:程序博客网 时间:2024/05/15 05:18
iOS — 错误处理部分(swift)
下面简单的介绍错误处理部分的应用
强制退出程序
ErrorType
错误处理
defer
一:强制退出程序
//满足条件才能通过,程序不会终止assert(1>0)assert(1<0, "Error")//assertionFailure("Error")//无论是否满足条件,程序都会终止precondition(1>0)precondition(1>0, "Error")//程序出现严重错误的时候,退出fatalError("Error")
二:ErrorType
// 之前使用可选型表示错误 - 错误时返回空Int("2")Int("Hello, Swift")// 但空不一定是错误"Hello, Swift".rangeOfString("Hi")// 更符合语意的表示:使用Swift的Error Handling机制// 比如文件读取; 网络连接 等等等等class VendingMachine{ struct Item{ enum Type: String{ case Water case Cola case Juice } let type: Type let price: Int var count: Int } enum Error: ErrorType{ case NoSuchItem case NotEnoughMoney(Int) case OutOfStock } private var items = [ "Mineral Water" : Item(type: .Water, price:2, count:10), "Coca Cola" : Item(type: .Cola, price: 3, count: 5), "Orange Juice" : Item(type: .Juice, price: 5, count: 3)] //这里的throws表示:这个函数可以抛出一个异常,如果没抛出异常,就会放回一个int值 func vend(itemName itemName: String, money: Int) throws -> Int{ guard let item = items[itemName] else{ throw VendingMachine.Error.NoSuchItem//抛出错误 } guard money >= item.price else{ throw VendingMachine.Error.NotEnoughMoney(item.price) } guard item.count > 0 else{ throw VendingMachine.Error.OutOfStock } dispenseItem(itemName) return money - item.price } private func dispenseItem(itemName: String){ items[itemName]!.count -= 1 print("Enjoy your",itemName) }}
三:错误处理
class VendingMachine{ struct Item{ enum Type: String{ case Water case Cola case Juice } let type: Type let price: Int var count: Int } enum Error: ErrorType, CustomStringConvertible{ case NoSuchItem case NotEnoughMoney(Int) case OutOfStock var description: String{ switch self { case .NoSuchItem: return "Not Such Item" case .NotEnoughMoney(let price): return "Not Enough Money. " + String(price) + " Yuan needed." case .OutOfStock: return "Out of Stock" } } } private var items = [ "Mineral Water" : Item(type: .Water, price:2, count:10), "Coca Cola" : Item(type: .Cola, price: 3, count: 5), "Orange Juice" : Item(type: .Juice, price: 5, count: 3)] func vend(itemName itemName: String, money: Int) throws -> Int{ guard let item = items[itemName] else{ throw VendingMachine.Error.NoSuchItem } guard money >= item.price else{ throw VendingMachine.Error.NotEnoughMoney(item.price) } guard item.count > 0 else{ throw VendingMachine.Error.OutOfStock } dispenseItem(itemName) return money - item.price } private func dispenseItem(itemName: String){ items[itemName]!.count -= 1 print("Enjoy your",itemName) } func display(){ print("Want something to drink?") for itemName in items.keys{ print( "*" , itemName ) } print("=============================") }}let machine = VendingMachine()machine.display()var pocketMoney = 3// Handle Error by try!//由于这个函数vend显示的告诉我们它要抛出异常,那么你就要处理异常,那么在调用这个函数的时候,我们就应该用try关键字去将异常进行处理,try!表示如果确定没有异常,直接处理,就像强制解包一样pocketMoney = try! machine.vend(itemName: "Coca Cola", money: pocketMoney)print(pocketMoney,"Yuan left")// Handle Error by try?//由于这个函数vend显示的告诉我们它要抛出异常,那么你就要处理异常,那么在调用这个函数的时候,我们try?,如果成功解包,就接着执行函数给我一个int的返回值,如果存在异常那么就返回一个niltry? machine.vend(itemName: "Coca Cola", money: pocketMoney)// Handle Error by do catch// 如果在do{}里面,出现异常,在catch{}就能够捕获异常do{ pocketMoney = try machine.vend(itemName: "Coca Cola", money: pocketMoney) print(pocketMoney,"Yuan left")}//如果你想对不同的异常进行不同的处理,那么可以使用catch将异常进行分类,对于不同的异常进行不同的处理catch VendingMachine.Error.NoSuchItem{ print("No Such Item")}catch VendingMachine.Error.NotEnoughMoney(let price){ print("Not Enough Money." , price , "Yuan needed.")}catch VendingMachine.Error.OutOfStock{ print("Out of Stock")}catch{ print("Error occured during vending.")}do{ pocketMoney = try machine.vend(itemName: "Coca Cola", money: pocketMoney) print(pocketMoney,"Yuan left")}catch let error as VendingMachine.Error{ print(error)}catch{ print("Error occured during vending.")}
四:defer
class VendingMachine{ struct Item{ enum Type: String{ case Water case Cola case Juice } let type: Type let price: Int var count: Int } enum Error: ErrorType, CustomStringConvertible{ case NoSuchItem case NotEnoughMoney(Int) case OutOfStock var description: String{ switch self { case .NoSuchItem: return "Not Such Item" case .NotEnoughMoney(let price): return "Not Enough Money. " + String(price) + " Yuan needed." case .OutOfStock: return "Out of Stock" } } } private var items = [ "Mineral Water" : Item(type: .Water, price:2, count:10), "Coca Cola" : Item(type: .Cola, price: 3, count: 5), "Orange Juice" : Item(type: .Juice, price: 5, count: 3)] func vend(itemName itemName: String, money: Int) throws -> Int{ //defer应该写在所有的错误处理的最前面,只要有一个错误机制需要处理,那么就会跳到defer defer{ print("Have a nice day") } guard let item = items[itemName] else{ throw VendingMachine.Error.NoSuchItem } guard money >= item.price else{ throw VendingMachine.Error.NotEnoughMoney(item.price) } guard item.count > 0 else{ throw VendingMachine.Error.OutOfStock } defer{ print("Thank you") } dispenseItem(itemName) return money - item.price } private func dispenseItem(itemName: String){ items[itemName]!.count -= 1 print("Enjoy your",itemName) } func display(){ print("Want something to drink?") for itemName in items.keys{ print( "*" , itemName ) } print("=============================") }}let vendingMachine = VendingMachine()var pocketMoney = 4do{ pocketMoney = try vendingMachine.vend(itemName: "Coca Cola", money: pocketMoney) print(pocketMoney,"Yuan left")}catch let error as VendingMachine.Error{ print(error)}catch{ print("Error occured during vending.")}/*defer 用在退出某个scope必须处理某些事情的时候最常见的使用场景:文件处理defer不一定必须用在Error Handling的情况下但是在处理错误的时候使用 defer 是最常见的情况defer本质是一种转移控制, 和 break, continue 一样*/
0 0
- iOS --- 错误处理部分(swift2.3)
- iOS --- 协议部分(swift2.3)
- iOS倒计时-swift2.3
- iOS --- 下标和计算符重载(swift2.3)
- iOS --- 扩展和泛型(swift2.3)
- iOS --- 面向协议的编程(swift2.3)
- iOS开发-后台交部分互错误处理
- swift2.0异常处理
- iOS 错误处理 (一)
- iOS 错误处理 (二)
- ios 数据库处理部分
- ios 数据库处理部分
- IOS部分异常处理
- 问答Swift2.0-基础部分
- Swift2.0-异常处理(Exception handler)
- IOS开发学习-篇外Swift2常用语法-3
- Swift2.0语法更新(3)
- 自定义数据类型 --- 类全解(swift2.3)
- 用netcat传输文件
- csv格式的文件上传下载时,逗号列的处理
- 数据库设计
- R语言笔记五
- 数组转换成json格式的数据
- iOS --- 错误处理部分(swift2.3)
- 面试知识相关内容-(1)
- 【FAQ】gitbook FileNotParsableError: xxx file cannot be parsed
- poj 3264
- Android SwipeSelector
- 翻转64 32 16 位
- 使用Android Studio的lint清除无用的资源文件
- 读书笔记-java网络编程-3线程-线程池和Executor
- Activiti进阶(十一)——分配组任务的三种方式