Swift3.0-错误处理

你可以用任何采用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)”

推荐阅读更多精彩内容