错误(异常)是在程序执行期间发生的意外事件。例如,
var numerator = 10
var denominator = 0
// try to divide a number by 0
var result = numerator / denominator // error code
这里,我们试图将一个数字除以零。因此,这种类型的错误会导致程序异常终止。
Swift 中错误处理的步骤
- 创建一个表示错误类型的枚举。
- 使用
throws
关键字创建抛出函数。 - 使用
try
关键字调用函数。 - 使用
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 中发生错误的原因
错误可能由多种原因引起。其中一些是:
- 无效的用户输入
- 设备故障
- 网络连接丢失
- 物理限制(磁盘空间不足)
- 代码错误
- 打开不可用的文件
由于错误会导致程序执行异常终止,因此处理这类错误非常重要。