美文网首页
关键字throw和rethrows

关键字throw和rethrows

作者: 我想哟 | 来源:发表于2022-03-23 10:33 被阅读0次

    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

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