swift基础—错误处理(Error Handling)

使用采用“Error”协议的类型来表示错误。

enum PrinterError: Error {

  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”来标记可以抛出错误的代码。在“catch”代码块中,除非你另外命名,否则错误会自动命名为“error”。

do {

  let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")

  print(printerResponse)

} catch {

  print(error)

}

可以使用多个“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")

使用“defer”代码块来表示在函数返回前,函数中最后执行的代码。无论函数是否会抛出错误,这段代码都将执行。使用“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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 错误处理 泛型 ErrorHandling defer使用关键字defer写一个代码块,它会在这个函数内所有代码执...
    HunterDude阅读 3,021评论 0 1
  • 126.析构器 在一个类实例销毁前,一个析构器会立即调用。使用deinit 关键字来表示析构器, 跟构造器写法类似...
    无沣阅读 4,300评论 0 4
  • 1、范型范型所解决的问题 函数、方法、类型:类,结构体,枚举,元组类型,协议参数,返回值,成员函数参数,成员属性类...
    我是小胡胡123阅读 4,357评论 0 1
  • 看到这本书,立马想到育儿沟通宝典《如何说孩子才会听 怎么听孩子才肯说》,两者颇有异曲同工之妙。 晨读文章总结的三大...
    秋秋絮语阅读 2,600评论 2 4
  • 六项精进法则真厉害 每次我有问题时,回去看都能找到解决办法。 比如这次,就是没有“付出不亚于任何人的努力”嘛! 报...
    百合手工阅读 1,292评论 0 0

友情链接更多精彩内容