关键字throw和rethrows

Swift中throwrethrows关键字用于异常处理(Error handling),都是用在函数中,可以简单理解为throw让函数或者方法可能出现的异常得到处理(比如用do-catch处理),而rethrows只是传递throw,本身没有针对函数或方法,下面详细解释一下:

1、throw

首先用在函数申明中,放在返回类型的前面,比如标准库中map的函数签名

//这里在map的函数参数中使用了throw,当元素小于0时抛出异常
enum NegativeError: Error {
    case negative
}

let nums = [-1, 1, 2, 3, 4]

do {
    let strNums = try nums.map { (num) throws -> String in
        if num >= 0 {
            return String(num)
        } else {
            throw NegativeError.negative
        }
    }
    print(strNums)  // Will no print
} catch let err {
    print(err) //negative
}

enum TestError: Error {
    case errorOne(Int)
    case errorTwo(String)
    case errorThree
    case errorUnknown
}

func testThrow(num: Int) throws -> String {
    switch num {
    case 1:
        throw TestError.errorOne(1)
    case 2:
        throw TestError.errorTwo("2")
    case 3:
        throw TestError.errorThree
    case 4:
        throw TestError.errorUnknown
    default:
        return "No Error"
    }
}
 do {
    let testResult: String = try testThrow(num: 1)
    print("0" + testResult) // Will no print
 } catch let TestError.errorOne(num) {
    print("1 \(num)") // 1
 } catch let TestError.errorTwo(str) {
    print("2" + str) // 2
 } catch TestError.errorThree {
    print("3 \(TestError.errorThree)") // errorThree
 } catch let err {
    print("4 \(err)") // errorUnknown
 }

2、rethrows

只起到传递异常的作用,在一个函数或者方法中,调用一个会throw的函数,就可以通过rethrows传递可能的异常,接上面的例子

func testRethrow(testThrowCall: (Int) throws -> String, num: Int) rethrows -> String {
    try testThrowCall(num)
}

do {
    let testResult: String = try testRethrow(testThrowCall: testThrow(num:), num: 3)
    print(testResult) // Will no print
} catch let TestError.errorOne(num) {
    print(num) // 1
} catch let TestError.errorTwo(str) {
    print(str) // 2
} catch TestError.errorThree {
    print(TestError.errorThree) // errorThree
} catch let err {
    print(err) // errorUnknown
}

参考文档

你可能感兴趣的:(关键字throw和rethrows)