Swift-15:throws与rethrows

throws 和 rethrows 的用法与作用

Swift中 throws 和 rethrows 关键字用于异常处理(Error handling),都是用在函数中,可以简单理解为throws让函数或者方法可能出现的异常得到处理(比如用do-catch处理),而rethrows只是传递throws,函数本身不需要处理异常

  • throws表示当前函数可能会抛出异常,需要处理
    如果在方法中,想要同时返回正常值和错误,需要通过throw返回错误,并且在方法返回值的箭头前面加throws关键字,在调用方法时,还需要加上try关键字,或者使用do-catch
  • rethrows表示以闭包或函数作为参数可能出现异常,但当前函数调用者不需处理异常 rethrows只是传递参数中的异常,也就是不需要关键字。调用方法处理异常,得到的是传递的异常。

比如高阶函数中的map, transform这个闭包类型的参数可能出现异常,但map函数不需要调用者处理异常

func map(@noescape transform: (Generator.Element) throws -> T) rethrows -> [T]

直接看可能不太明白,那么我写一段代码,你可能会更好理解

throws

enum TestError: Error {
    case fail
    case unknow
}

extension TestError: LocalizedError{
    var errorDescription: String? {
        switch self {
        case .fail:
            return "卧槽失败"
        case .unknow:
            return "老子也不知道什么类型"
        }
    }
}

//CustomNSError相当于NSError
extension TestError: CustomNSError{
    var errorCode: Int{
        switch self {
        case .fail:
            return 404
        case .unknow:
            return 504
        }
    }
}

func test(a: Any) throws -> String {
    if type(of: a) == Int.self {
        return "Int"
    }
    throw TestError.unknow
}

//let d = try test(a: 10.0)//向上甩锅
//let d = try!  test(a: 10.0)//表示不会出现异常,出现就崩溃
//let d = try? test(a: 10.0)//返回可选类型,出现异常返回nil
//异常处理 do catch
do {
    let d = try test(a: 10.0)
    print(d)
} catch {
    print(error.localizedDescription)
}


rethrows

// 闭包标记为throws
func testRethrow(testThrowCall: (Int) throws -> String, num: Int) rethrows -> String {
    try testThrowCall(num)
}
//不处理异常
let str = testRethrow(testThrowCall: { (int) -> String in
    return "\(int)"
}, num: 10)

print(str)
//处理异常
do {
    let testResult: String = try testRethrow(testThrowCall: { (int) -> String in
        return try test(a: 10.0)
    }, num: 10)
    print(testResult)  // Will no print
} catch TestError.unknow {
    print(TestError.unknow)
}

上面代码中实现了处理异常和不处理异常,throws标记的函数需要使用try

你可能感兴趣的:(Swift-15:throws与rethrows)