当前位置: 代码迷 >> 综合 >> Day24:错误处理
  详细解决方案

Day24:错误处理

热度:58   发布时间:2023-09-29 18:53:05.0
  • 错误表示
  1. 在swift中如果我们要定义一个表示错误的类型非常简单,只要遵循Error协议就可以了,我们通常用枚举或结构体来表示错误类型,枚举可能用的多一些,因为它能直观表达当前错误类型的每中错误细节。
  • 如何抛出错误
  1. 函数、方法和初始化器都可以抛出错误。需要在参数列表后面,返回值前面加throws关键字。
  • 使用Do-Catch 做错误处理
  1. 在swift中我们使用do-catch快对错误惊醒捕获,当我们调用一个throws声明的函数获方法时,我们必须把调用语句放在do语句块中,同时do语句块后面紧接着使用catch语句块。
  • try?
  1. try?会将错误值转换为可选值,当调用try?+函数或方法语句时候,如果函数或方法抛出错误,程序不会发生崩溃,返回一个nil,如果没有抛出错误则返回可选值。
  • try!
  1. 如果你确信一个函数或者方法不会抛出错误,可以使用try!来中断错误的传播。但是如果错误真的发生了,你会得到一个运行时错误。
  • 指定退出的清理动作
  1. defer 关键字;defer block里的代码会在函数return之前执行,无论函数是从哪个分支return的,还是有throw,还是自然而然走到最后一行。
  • 【代码演示】
    enum VendingMachineError:Error {case invalidSelectioncase insufficietFunds(coinsNeed:Int)case outOfStock
    }struct Item {var price:Intvar count:Int
    }class VendingMachin {var inventory = ["Candy bar":Item(price: 6, count: 8),"Chips":Item(price: 10, count: 9),"Bread":Item(price: 15, count: 5)]var coinsDesposited = 0func vend(iteamName:String) throws {guard let item = inventory[iteamName] else{throw VendingMachineError.invalidSelection}guard item.count > 0 else {throw VendingMachineError.outOfStock}guard coinsDesposited >= item.price else {throw VendingMachineError.insufficietFunds(coinsNeed: item.price - coinsDesposited)}coinsDesposited -= item.pricevar newItem = itemnewItem.count -= 1inventory[iteamName] = newItemprint("售卖成功")}}var machine = VendingMachin()machine.coinsDesposited = 5do {try machine.vend(iteamName: "Chips")
    } catch VendingMachineError.invalidSelection{print("no such thing")
    } catch VendingMachineError.insufficietFunds(coinsNeed: let coinsNeed){print("you need more coins:\(coinsNeed)")
    } catch VendingMachineError.outOfStock{print("out ot stock")
    } catch{print("unexpcted error")
    }