1.表示并抛出错误
我们一般实现Error 协议的枚举来构建错误状态:
enum VendingMachineError: Error {
case invalidSelection //选择无效
case insufficientFunds(coinsNeeded: Int) //金额不足
case outOfStock //缺货
}
2.处理错误
Swift 中有 4 种处理错误的方式:
你可以把函数抛出的错误传递给调用此函数的代码;
用 do-catch语句处理错 误;
将错误作为可选类型处理;
或者断言此错误根本不会发生。
用 throwing函数传递错误
为了表示一个函数、方法或构造器可以抛出错误,在函数声明的参数列表之后加上 throws关键字。一个标有 ows关键字的函数被称作throwing函数。如果这个函数指明了返回值类型, throws关键词需要写在箭头( - >)的前面。
func canThrowErrors() throws -> String
//实际使用
func vend(itemNamed name: String) throws {
guard item.count > 0 else {
throw VendingMachineError.OutOfStock
}
self.someMethed()
}
用 Do-Catch处理错误
可以使用一个 do-catch 语句运行一段闭包代码来处理错误。如果在 do子句中的代码抛出了一个错误,这个错误会与 catch 子句做匹配,从而决定哪条子句能处理它。
do {
try expression
statements
} catch pattern 1 {
statements
} catch pattern 2 where condition {
statements
}
将错误转换成可选值
可以使用 try? 通过将错误转换成一个可选值来处理错误。
如果在评估 try? 表达式时一个错误被抛出,那么表达式的值就是 nil。
let x = try? someThrowingFunction()
禁用错误传递
有时你知道某个 throwing 函数实际上在运行时是不会抛出错误的,在这种情况下,你可以在表达式前面写 try!来禁用错误传递。
3.指定清理操作
可以使用 defer 语句在即将离开当前代码块时执行一系列语句。该语句让你能执行一些必要的清理工作,无论是由于抛出错误而离开,还是由于诸如 return或者 break 的语句。
第一条 defer 语句中的代码会在第二条 defer语句中的 代码被执行之后才执行,以此类推。