美文网首页
Swift-15:throws与rethrows

Swift-15:throws与rethrows

作者: 恍然如梦_b700 | 来源:发表于2021-04-16 00:56 被阅读0次

    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<T>(@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

          本文链接:https://www.haomeiwen.com/subject/iiljlltx.html