iOS --- 错误处理部分(swift2.3)

来源:互联网 发布:金牛奇迹for mac 编辑:程序博客网 时间:2024/05/15 05:18

iOS — 错误处理部分(swift)

下面简单的介绍错误处理部分的应用

  1. 强制退出程序

  2. ErrorType

  3. 错误处理

  4. 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
原创粉丝点击