跳到主要内容

Swift中的错误处理

提示
  1. 错误处理基础:在Swift中,错误处理涉及创建错误类型枚举、使用throws关键字创建能抛出错误的函数,以及用try关键字调用这些函数。
  2. do-catch语句:使用do-catch语句来捕获和处理通过try调用的函数可能抛出的错误。do块内执行可能抛出错误的代码,catch块处理捕获到的错误。
  3. 禁用错误处理:使用try!来禁用错误处理,表明对应的函数调用不会抛出错误。这种方法适用于确定不会发生错误的场景,但如果实际发生错误,程序会崩溃。

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

var numerator = 10
var denominator = 0

// 尝试除以 0
var result = numerator / denominator // 错误代码

这里,我们试图进行除法运算。这种类型的错误会导致程序异常终止。

Swift 中错误处理的步骤

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

1. 创建错误枚举

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

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

让我们看一个示例,

enum DivisionError: Error {
case dividedByZero
}

这里,我们创建了一个名为 DivisionError 的枚举,其值为 dividedByZero

由于 DivisionError 符合 Error 协议,我们现在将能够抛出枚举的错误值。

2. 创建可抛出错误的函数

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

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

// 使用 throws 关键字创建可抛出错误的函数
func division(numerator: Int, denominator: Int) throws {

// 如果除以 0 则抛出错误
if denominator == 0 {
throw DivisionError.dividedByZero
}
...
}

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

现在,基于函数调用时传递的值,如果满足错误条件,函数将抛出错误。

注意throw 关键字与 return 关键字的效果相同。return 从函数返回某些值,而 throw 则从函数返回错误值。

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

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

// 使用 try 关键字调用函数
try division(numerator: 10, denominator: 0)

但是,错误处理过程尚未完成。如果我们现在运行程序,我们会收到错误消息:“抛出了一个错误且未被捕获”。

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

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

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

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

catch DivisionError.dividedByZero {
// 语句
}

这里,我们在 do 块中调用了可抛出错误的函数 division(),并附上 catch 块以捕获函数抛出的错误(如果有)。

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

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

示例:Swift 错误处理

// 创建一个包含错误值的枚举
enum DivisionError: Error {

case dividedByZero
}

// 使用 throws 关键字创建一个抛出异常的函数
func division(numerator: Int, denominator: Int) throws {

// 如果除数为 0,则抛出错误
if denominator == 0 {
throw DivisionError.dividedByZero
}

else {
let result = numerator / denominator
print(result)
}
}

// 在 do 块中调用抛出异常的函数
do {
try division(numerator: 10, denominator: 0)
print("有效的除法")
}

// 如果函数抛出错误,则捕获错误
catch DivisionError.dividedByZero {
print("错误:除数不能为 0")
}

输出

错误:除数不能为 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)
}
}

// 禁用错误处理
try! division(numerator: 10, denominator: 5)

输出

Result: 2

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

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

这里,因为我们已经为 denominator 分配了值 5,我们知道程序不会抛出错误。所以我们禁用了错误处理。

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

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

Swift 中错误的原因

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

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

由于错误会异常地终止程序的执行,处理这类错误很重要。