美文网首页
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

    throws 和 rethrows 的用法与作用 Swift中 throws 和 rethrows 关键字用于异常...

  • 2019-09-28 throws与rethrows区别

    新建一个playground,将代码全部替换为下面演示代码 import UIKitenumero : Error...

  • 03.异常的抛出

    throws方式处理异常 A:throws使用:权限修饰符 返回值类型 方法名(形参列表) throws 异常类...

  • 寒假10:异常

    异常描述: 例子: 如果时RuntimeException,可以throws也可以throws

  • throws

    在做swift 的开发的时候 有的时候 有些方法会显示throws ,意思就是有可能会抛出异常,所以在遇到有thr...

  • Java面试题(异常)

    74. throw 和 throws 的区别? throws是用来声明一个方法可能抛出的所有异常信息,throws...

  • Java基础-异常(6)

    74. throw 和 throws 的区别? throws是用来声明一个方法可能抛出的所有异常信息,throws...

  • try/catch与throws异常捕捉

    方法声明throws Exception,意味着方法调者处理异常。 perform() throws JSONEx...

  • swift throws 和 throw

    throws---------->把异常交给调用处。 可以结合throw来同时使用。 throws用在方法声明处,...

  • Java基础系列-throw、throws关键字

    原创文章,转载请标注出处:《Java基础系列-throw、throws关键字》 一、概述 throw和throws...

网友评论

      本文标题:Swift-15:throws与rethrows

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