Swift错误处理
Swift错误处理参考:
强制退出程序使用 assert(1>0,"Error")
assertionFailure("failure")
注意 不过有些时候,希望程序在真正执行起来的时候,在某些情况下,遇到一些严重的错误,程序要强制退出,可以使用 precondition(1>0,"Error") fatalError("Error")
Error在一般的处理过程中可以返回 1.自定义错误类型:
如下: enum VendingError: Error{
case NoSuchItem
case NotEnoughMoney(Int)
case OutOfStock
}
2.抛出错误,使用 func vend(itemName itemName: String,money: Int) throws -> Int{
guard let item = items[itemName] else{
throw VendingMachine.VendingError.NoSuchItem
}
guard money >= item.price else{
throw VendingMachine.VendingError.NotEnoughMoney(item.price)
}
guard item.count > 0 else{
throw VendingMachine.VendingError.OutOfStock
}
return money - item.price
}
}
此时,这个函数就有两种退出的方式: 1.正确的return 错误处理对于抛出异常的函数,就不能直接调用了,要处理异常。使用
try! machine.vend(itemName: "Coca Cola",money: pocketMoney)
if let leftMoney = try? machine.vend(itemName: "Coca Cola",money: pocketMoney)
{
}else{
}
如果希望更具错误的类型,来做不同的处理。就需要使用 do{
pocketMoney = try machine.vend(itemName: "Coca Cola",money: pocketMoney)
print(pocketMoney,"Yuan left")
}catch{
print("Error occured during vending")
}
要处理不同类型的异常,形式如下: do{
pocketMoney = try machine.vend(itemName: "Coca Cola",money: pocketMoney)
print(pocketMoney,"Yuan left")
}catch VendingMachine.VendingError.NoSuchItem{
print("No Such Item")
}catch VendingMachine.VendingError.NotEnoughMoney(let price){
print("No Enough Money",price,"Yuan needed.")
}catch VendingMachine.VendingError.OutOfStock{
print("Out of Stock")
}catch{
print("Error occured during vending.")
}
还有一种形式是: do{
pocketMoney = try machine.vend(itemName: "Coca Cola","Yuan left")
}catch let error as VendingMachine.VendingError{
}catch{
print("Error occured during vending.")
}
defer在其它语言中,错误处理通常有个 在 func vend(itemName itemName: String,money: Int) throws -> Int{
defer {
print("Hava a nice day")
}
guard let item = items[itemName] else{
throw VendingMachine.VendingError.NoSuchItem
}
......
}
如果有多个defer,是按倒序来执行的,如下的方法: func vend(itemName itemName: String,money: Int) throws -> Int{
defer {
print("Hava a nice day")
}
guard let item = items[itemName] else{
throw VendingMachine.VendingError.NoSuchItem
}
guard money >= item.price else{
throw VendingMachine.VendingError.NotEnoughMoney(item.price)
}
guard item.count > 0 else{
throw VendingMachine.VendingError.OutOfStock
}
defer {
print("Thank you")
}
dispenseItem(itemName: itemName)
return money - item.price
}
private func dispenseItem(itemName: String){
items[itemName]!.count -= 1
print("Enjoy your",itemName)
}
如果调用如下的方法,正常的执行,不会抛出异常: var pocketMoney = 3
try? machine.vend(itemName: "Coca Cola",money: pocketMoney)
则其输出顺序为: Enjoy your Coca Cola Thank you Hava a nice day 如果调用如下方法,抛出异常: var pocketMoney = 2
try? machine.vend(itemName: "Coca Cola",money: pocketMoney)
则控制台只会输出: Hava a nice day 这是因为抛出异常结束程序,只会找抛出异常之前的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |