Swift中的错误处理
- 错误处理基础:在Swift中,错误处理涉及创建错误类型枚举、使用
throws
关键字创建能抛出错误的函数,以及用try
关键字调用这些函数。 - do-catch语句:使用
do-catch
语句来捕获和处理通过try
调用的函数可能抛出的错误。do
块内执行可能抛出错误的代码,catch
块处理捕获到的错误。 - 禁用错误处理:使用
try!
来禁用错误处理,表明对应的函数调用不会抛出错误。这种方法适用于确定不会发生错误的场景,但如果实际发生错误,程序会崩溃。
错误(异常)是在程序执行过程中发生的意外事件。例如,
var numerator = 10
var denominator = 0
// 尝试除以 0
var result = numerator / denominator // 错误代码
这里,我们试图进行除法运算。这种类型的错误会导致程序异常终止。
Swift 中错误处理的步骤
- 创建一个表示错误类型的枚举。
- 使用
throws
关键字创建一个可抛出错误的函数。 - 使用
try
关键字调用函数。 - 将带有
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 中错误的原因
错误可能由多种原 因引起。其中一些是:
- 无效的用户输入
- 设备故障
- 网络连接丢失
- 物理限制(磁盘内存不足)
- 代码错误
- 打开不可用的文件
由于错误会异常地终止程序的执行,处理这类错误很重要。