你可以用任何采用ErrorProtocol协议的类型代表错误。(Swift 2.2是ErrorType)
enum PrinterError: ErrorProtocol {
case outOfPaper
case noToner
case onFire
}
使用throw来抛出错误, 用throws标记一个函数可以抛出错误。如果一个函数抛出错误,函数会立即返回,然后调用函数的代码处理错误。
func send(job: Int, toPrinter printerName:String) throws -> String {
if printerName == "Never Has Toner" {
throw PrinterError.noToner
}
return "Job sent"
}
有几种方式可以处理错误。一种方法是用do-catch。在do 里面,用try标记可以抛出错误的代码,错误的名称默认是error除非你能给一个不同的名字。
do {
let printerResponse = try send(job: 1040, toPrinter: "Never Has Toner")
print(printerResponse)
}catch {
print(error)
}
//打印出noToner
你可以用多个catch处理特定的错误。你可以像在switch的case中那样写catch。
do {
let printerResponse = try send(job:1440, toPrinter: "Gutenberg")
print(printerResponse)
} catch PrinterError.onFire {
print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
print("Printer error:\(printerError).")
} catch {
print(error)
}
另一种处理错误的方法是使用try?将结果转换为可选的。如果函数抛出一个错误,返回的结果是nil。否则,结果是一个函数返回的可选型值。
let printerSuccess = try? send(job:1884, toPrinter:"Mergenthaler")
let printerFailure = try? send(job:1885, toPrinter:"Never Has Toner")
Swift可以用defer写一个在函数中return之前执行的代码块。这个代码块不管函数是否会报错都会执行。你可以用defer写一个彼此相近的创立和清理代码,尽管它们需要在不同的时间执行。
var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]
func fridgeContains(_ food: String) -> Bool {
fridgeIsOpen = true
defer {
fridgeIsOpen = false
}
let result = fridgeContent.contains(food)
return result
}
fridgeContains("banana")
print(fridgeIsOpen)”