Swift错误处理

关键词: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("这个函数将要退出了")
}