swift学习笔记13之错误处理

by kingzcheung on July 26, 2016

错误处理是响应错误以及从错误中返回的过程。swift提供第一类错误支持,包括在运行时抛出,捕获,传送和控制可回收错误。

枚举错误类型

//通过枚举来定义可能出现的错误
enum BuyError:ErrorType {
    case InvalidSelection
    case InsufficientFunds(required: Double)
    case OutOfStock
}

错误抛出

通过在函数或方法声明的参数后面加上throws关键字,表明这个函数或方法可以抛出错误。

//通过枚举来定义可能出现的错误
enum BuyError:ErrorType {
    case InvalidSelection//请求的物品不存在
    case InsufficientFunds(required: Double)//金额不够
    case OutOfStock//请求的物品已经卖完了
}

struct Item {
    var price:Double
    var count:Int
}

var inventory = [
    "Ice Cre":Item(price: 1.25, count: 7),
    "PiSa":Item(price: 3, count: 4)
]

func vend(money:Double,name:String) throws {
    let item = inventory[name]
    guard item  != nil else{
        throw BuyError.InvalidSelection
    }
    
    guard item?.count > 0 else{
        throw BuyError.OutOfStock
    }
    
    if money < item?.price {
        throw BuyError.InsufficientFunds(required: money)
    }
    
}

捕捉和处理错误

使用do-catch语句来就捕获和处理错误,当调用一个抛出函数的时候,在调用前面加上try。这个关键字表明函数可以抛出错误,而且在try后面代码将不会执行。

do{
    let a = try vend(3, name: "abc")
    print(a)
}catch BuyError.InvalidSelection  {
    print("Invalid Selection")
}catch BuyError.OutOfStock {
    print("Out of Stock.")
} catch BuyError.InsufficientFunds(3) {
    print("Insufficient funds. Please insert an additional .")
}

禁止错误传播

通过try!来调用抛出函数或方法禁止了错误传送,并且把调用包装在运行时断言,这样就不会抛出错误。如果错误真的抛出了,会触发运行时错误。

defer 收尾操作

swift 中的defer作用几乎与golang中的defer一样,就是函数是否有错误,都能在最后执行defer语句。与golang的defer的执行顺序一样,swift的defer也是反向执行,即最后一个defer总会比前一个defer先执行。