18. 错误处理

文章目录
  1. 1. 表示和抛出错误
  2. 2. 处理错误
    1. 2.1. 使⽤抛出函数传递错误
    2. 2.2. 使⽤ Do-Catch 处理错误
    3. 2.3. 将错误转换为可选值
    4. 2.4. 禁⽤错误传播
  3. 3. 指定清理操作
  1. Representing and Throwing Errors
  2. Handling Errors
  3. Specifying Cleanup Actions

表示和抛出错误

在 Swift 中,错误是遵循 Error 协议的值。Error 是一个空协议,表明遵循该协议的类型 可以用于错误处理。

处理错误

在 Swift 中有四种处理错误的方式:

  1. 您可以将错误从函数传递给调用该函数的代码
  2. 可以使 用 do - catch 语句处理错误,
  3. 可以通过可选值处理错误
  4. 通过断言保证错误不会 发生

使⽤抛出函数传递错误

为了让函数、方法或者初始化程序可以抛出错误,您需要在函数声明的参数后面添写 throws 关键字。标有 throws 的函数称为抛出函数。如果函数指定了返回类型,则在返回箭头 ( -> ) 之前添写 throws 关键字。

1
func canThrowErrors() throws -> String

注意:只有抛出函数才能传递错误。任何在非抛出函数中抛出错误都必须在函数内部进行处理。

使⽤ Do-Catch 处理错误

在可抛出函数中,封闭的do - catch 子句或调用者必须处理错误。 如果错误传播到顶级作用域而未被处理, 则会出现运行时错误。

将错误转换为可选值

你可以使用 try? 将错误转换为可选值来处理错误。 如果在执行 try? 表达式时抛出 错误,表达式的值将为 nil 。

禁⽤错误传播

有时你知道可抛出函数或方法实际上不会在运行时抛出错误。 在这种情况下,你可以在表达 式之前添加 try! 来禁用错误传播,并把调用过程包装在运行时断言中,从而禁止其抛出 错误。 而如果实际运行时抛出了错误,你将收到运行时错误。

指定清理操作

当代码执行到即将离开当前代码块之前,可以使用 defer 语句来执行一组语句。无论是 因为错误而离开 — 抑或是因为诸如 return 或 break 等语句而离开, defer 语句都可以让你执行一些必要的清理。例如,你可以使用 defer 语句来关闭文件描述符 或释放手动分配的内存。

defer 语句会推迟执行,直到退出当前作用域。该语句由 defer 关键字和稍后要执 行的语句组成。延迟语句可能不包含任何将控制转移出语句的代码,例如 break 或 return 语句,或抛出错误。延迟操作的执行顺序与它们在源代码中编写的顺序相反。也 就是说,第一个 defer 语句中的代码最后一个执行,第二个 defer 语句中的代码倒 数第二个执行,依此类推。源代码中的最后一个 defer 语句最先执行。

注意: 即使没有涉及错误处理代码,也可以使用 defer 语句。