Swift 错误处理

错误(异常)是在程序执行期间发生的意外事件。例如,

var numerator = 10
var denominator = 0

// try to divide a number by 0
var result = numerator / denominator // error code

这里,我们试图将一个数字除以零。因此,这种类型的错误会导致程序异常终止。


Swift 中错误处理的步骤

  1. 创建一个表示错误类型的枚举。
  2. 使用 throws 关键字创建抛出函数。
  3. 使用 try 关键字调用函数。
  4. 使用 do {...} 块包装 try 代码,并添加 catch {...} 块来处理所有错误。

1. 创建错误枚举

在 Swift 中,我们需要创建一个枚举来表示我们在编写程序时可能遇到的错误类型。

我们创建的枚举必须遵循 Error 协议,以便我们可以在函数内部抛出一个错误值。

让我们看一个例子,

enum DivisionError: Error {
  case dividedByZero
}

在这里,我们创建了一个名为 DivisionError 的枚举,其中包含 dividedByZero 的值。

由于 DivisionError 遵循 Error 协议,我们现在就可以抛出该枚举的错误值了。


2. 创建抛出函数

为了抛出错误,我们需要使用 throws 关键字创建一个抛出函数。

然后,我们在函数中使用 throw 语句抛出由枚举表示的特定错误。例如,

// create throwing function using throws keyword
func division(numerator: Int, denominator: Int) throws {

// throw error if divide by 0
  if denominator == 0 {
    throw DivisionError.dividedByZero
  }
  ...     
}

在这里,我们使用 throws 关键字创建了一个名为 division() 的抛出函数。如果 denominator == 0,该函数将抛出 DivisionError 枚举的 dividedByZero 值。

现在,根据函数调用时传递的值,如果满足错误条件,函数就会抛出错误。

注意throw 关键字的作用与 return 关键字相同。return 从函数返回某个值,而 throw 从函数返回错误值。


3. 使用 try 关键字调用函数

在 Swift 中,我们在调用抛出函数时使用 try 关键字。它表示函数可能会抛出错误。例如,

// call throwing function using try keyword
try division(numerator: 10, denominator: 0)

然而,错误处理过程仍然不完整。如果我们现在运行程序,我们会收到一条错误消息:An error was thrown and was not caught(已抛出错误但未捕获)。

因此,为了捕获抛出的错误,我们使用 do-catch 语句。


4. 使用 do-catch 语句处理错误

在 Swift 中,我们将 try 代码包装在 do 块中,并添加 catch 块来处理所有错误。例如,

do {
  try division(numerator: 10, denominator: 0)
  ...
}

catch DivisionError.dividedByZero {
  // statement
}

在这里,我们从 do 块中调用了抛出函数 division(),并附加了 catch 块来捕获函数抛出的任何错误。

上述 catch 块是根据 DivisionError 的枚举值执行的。

这是处理程序中可能发生的错误的最后一步。


示例:Swift 错误处理

// create an enum with error values
enum DivisionError: Error {

  case dividedByZero
}

// create a throwing function using throws keyword
func division(numerator: Int, denominator: Int) throws {

  // throw error if divide by 0
  if denominator == 0 {
    throw DivisionError.dividedByZero
  }
    
  else {
    let result = numerator / denominator
    print(result)
  }
}

// call throwing function from do block
do {
  try division(numerator: 10, denominator: 0)
  print("Valid Division")
}

// catch error if function throws an error
catch DivisionError.dividedByZero {
  print("Error: Denominator cannot be 0")
}

输出

Error: Denominator cannot be 0

在上面的例子中:

  • DivisionError 是一个枚举
  • division() 是一个抛出函数
  • do-catch 语句处理错误

我们使用 try 将值传递给抛出函数

try division(numerator: 10, denominator: 0)

以检查传递的值是否满足错误条件。

如果错误条件

  • 满足 - 抛出函数抛出错误,该错误被 catch 块捕获。
  • 不满足 - 执行抛出函数中的 else 语句和 do 块中的 print 语句。

禁用错误处理

在 Swift 中,有时我们可以确信抛出函数在运行时不会抛出错误。

在这种情况下,我们可以在函数调用时写 try! 来禁用错误处理。例如,

enum DivisionError: Error {
  
  case dividedByZero
}

func division(numerator: Int, denominator: Int) throws {
  if denominator == 0 {
    throw DivisionError.dividedByZero
  }
    
  else {
    let result = numerator / denominator
    print("Result:", result)
  }
}

// disable error handling
try! division(numerator: 10, denominator: 5)

输出

Result: 2

在上面的示例中,我们在函数调用时使用了 try! 来禁用错误处理。

try! division(numerator: 10, denominator: 5)

这里,由于我们将值 5 分配给了 denominator,我们知道程序不会抛出错误。因此,我们禁用了错误处理。

另请注意,当我们使用 try! 时,我们不需要使用 do-catch 语句。

注意:如果我们使用 try! 并且发生了错误,我们的应用程序将直接崩溃。


Swift 中发生错误的原因

错误可能由多种原因引起。其中一些是:

  • 无效的用户输入
  • 设备故障
  • 网络连接丢失
  • 物理限制(磁盘空间不足)
  • 代码错误
  • 打开不可用的文件

由于错误会导致程序执行异常终止,因此处理这类错误非常重要。

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战