美文网首页swift
Swift3.0-错误处理

Swift3.0-错误处理

作者: 民谣程序员 | 来源:发表于2016-07-04 10:01 被阅读4157次

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

    相关文章

      网友评论

        本文标题:Swift3.0-错误处理

        本文链接:https://www.haomeiwen.com/subject/qmafjttx.html