关键词:Swift, iOS, 错误处理, 断言, 先决条件, throw, Error, do-try-cath, try-cath, assert, precondition, defer
概述
- throw表示一个可能会抛出异常的函数。
- 标有 throws 关键字的函数被称作 throwing 函数。
- 如果这个函数有返回值,throws需要写在 -> 前面。
- 无返回值:func simpleFunc() throws {//something}
- 有返回值:func simpleFunc(index: Int) throws -> Int {//something}
- 只有 throwing 函数可以传递错误。其他方式抛出的错误,只能在函数内部处理。
示例
///这里定义一个错误异常
enum TestError: Error {
case ErrorAAA
case ErrorBBB
case ErrorCCC
}
///这是一个可能抛出异常的函数
//func simpleFunc() throws {
func simpleFunc(index: Int) throws -> Int {
let arr = [11, 22, 33]
var res: Int
if index > arr.count - 1 {
print("这里报错AAA")
throw TestError.ErrorAAA
//throw之后的代码永远不会被执行
} else if index < 0 {
print("这里报错BBB")
throw TestError.ErrorBBB
//throw之后的代码永远不会被执行
} else {
print("这里没有报错")
res = arr[index]
}
return res
}
错误处理
do-try-catch
do {
let num = try simpleFunc(index: -2)
//如果没有抛出错误,这里才会被执行
print("拿到的数据:\(num)")
} catch TestError.ErrorAAA {
print("函数抛出了错误AAA")
} catch TestError.ErrorBBB {
print("函数抛出了错误BBB")
} catch {
print("函数抛出了其他的错误")
}
可选值
let res = try? simpleFunc(index: 4)
print("拿到的结果:\(res)")
禁用错误传递
仅适用于确定不会抛出错误的情况,相当于可选项的强制解析。
let ret = try! simpleFunc(index: 2)
print("拿到的结果:\(ret)")
断言与先决条件
相同:都是主动抛出异常,终止程序的运行。
不同:断言只在开发环境中生效,先决条件在开发和生产环境中都生效。
断言
断言只在开发环境中生效。
let age = -3
//当不满足这个条件时,抛出异常,输出断言信息
assert(age > 0, "这里是断言信息")
//不需要断言信息
assert(age > 0)
//不需要判断条件,直接抛出异常
assertionFailure("直接抛出断言信息")
先决条件
先决条件在开发环境和生产环境中都会生效。
var age = -3
//当不满足这个条件时,抛出异常
precondition(age > 0, "这是一个错误信息")
//不需要断言信息
precondition(age > 0)
//不需要判断条件,直接抛出异常
preconditionFailure("直接抛出断言信息")
指定清理操作
defer语句在整个函数将要退出时才会执行。
defer {
print("这个函数将要退出了")
}