Swift错误处理

定义

错误处理是响应错误以及从错误中回复的过程,那这个过程包括抛出、捕获、传递和操作可恢复错误的支持。

讨论

有些操作可能无法在所有的状态中都能返回一个有意义的值,当然可选类型可以帮忙表示失败的结果,但是错误处理可以让你更好的理解错误原因。
swift关于错误处理的是协议Error,这个是一个控协议,可以通过枚举结构体遵循这个协议来实现错误处理。

swift的异常处理有四种方式

  • 通过函数的方式传递下去
  • do-try-catch方式捕获
  • try?将错误作为可选性处理,错误时返回nil。
  • try! 断言错误不会发生,但是如果发生了会有运行时错误。

例子

举个自动贩卖机的例子。当我们去自动贩卖机买东西的时候,可能遇到以下问题

enum VendingMachineError:Error{
    case invalidSelection //选择无效
    case insufficientFunds(coinsNeeded:Int) //金额不足
    case outOfStock       //缺货
}

接下来我们创建一个自动贩卖机类型

//商品结构体
struct Item{
    var price: Int
    var count: Int
}
//自动贩卖机
class VendingMachine{
    var inventory = [
        "Candy Bar" : Item(price: 12, count: 7),
        "Chips" : Item(price: 10, count: 4),
        "Pretzels" : Item(price: 7, count: 4)
    ]
    var coinsDesposited = 2
    func vend(itemNamed name:String )throws {
        guard let item = inventory[name] else{
            throw VendingMachineError.invalidSelection
        }
        guard item.count > 0 else {
            throw VendingMachineError.outOfStock
        }
        guard item.price <= coinsDesposited else {
            throw VendingMachineError.insufficientFunds(coinsNeeded: item.price-coinsDesposited)
        }
        var newItem = item
        newItem.count -= 1
        inventory[name] = newItem
        
        print("dispensing\(name)")
    }
}

由上可知,我们分别检验商品是否存在,库存是否充足以及投币是否足够。如果不满足就抛出异常。下面我们分别看一下上面说过的四种错误处理方式。
可以看出在函数体后,返回值之前添加throws关键字表明该方法可能抛出异常。

通过函数的方式传递下去

比如添加了一个购买者姓名的属性,通过try + 方法调用的方式可以将异常传递下去。

 func vend(itemNamed name:String ,buyerName:String)throws{
        self.buyerName = buyerName
        try vend(itemNamed: name)
    }

do-try-catch方式捕获

var test = VendingMachine();
do {
    try test.vend(itemNamed: "Chips")
} catch VendingMachineError.invalidSelection {
    print("invalidSelection")
} catch VendingMachineError.outOfStock{
    print("outOfStock")
} catch VendingMachineError.insufficientFunds(let coinsNeeded){
    print("insufficientFunds\(coinsNeeded)")
}

通过do可以捕获捕获方法作用于内抛出的异常,catch可以以枚举的方式处理。

try?将错误作为可选性处理,错误时返回nil。

let x = try? test.vend(itemNamed: "Chips")

通过try?的方式,当排出异常的时候x值为nil,正常可以返回一个可选型返回值。

try! 断言错误不会发生,但是如果发生了会有运行时错误。

let x = try! test.vend(itemNamed: "Chips")

当我们断言方法不会抛出异常的时候可以用try!抛出异常的时候会有运行时错误,比较危险。

结构体表示Error

有些时候我们要描述的错误比较复杂,我们也可以用结构体遵循Error协议去实现异常处理。
官方给出的例子,xml解析错误

struct XMLParsingError: Error {
    enum ErrorKind {
        case invalidCharacter
        case mismatchedTag
        case internalError
    }

    let line: Int
    let column: Int
    let kind: ErrorKind
}

捕获错误

do {
    let xmlDoc = try parse(myXMLData)
} catch let e as XMLParsingError {
    print("Parsing error: \(e.kind) [\(e.line):\(e.column)]")
} catch {
    print("Other error: \(error)")
}

综上swift中的错误处理是非常灵活的,可以用多种数据结构描述错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349