美文网首页
Swift 错误捕捉及处理⑪

Swift 错误捕捉及处理⑪

作者: Aliv丶Zz | 来源:发表于2020-08-05 17:04 被阅读0次

    1. 自定义错误

    • Swift中可以通过Error协议自定义运行时的错误信息
    • 函数内部通过throw抛出自定义Error,可能会抛出Error的函数必须加上throws声明
    • 需要使用try调用可能会抛出Error的函数
    enum SomeError : Error {
        case illegalArg(String)
        case outOfBounds(Int, Int)
        case outOfMemory
    }
    
    func divide(v1: Int, v2: Int) throws ->  Int {
        if v2 == 0 {
            throw SomeError.illegalArg("0不能作为除数")
        }
       return  v1 / v2
    }
    
    
    

    2. 处理Error

      1. 可以使用do-catch捕捉Error进行处理,抛出Error后,try下一句知道作用域结束的代码都将停止执行
      1. 不捕捉Error,在当前函数增加throws声明,Error将自动抛给上层函数,如果最顶层函数(main)依然没有捕捉Error,那么程序将终止

    方式1

    func test(){
        print("1")
        do{
            print("2")
            let res = try divide(v1: 10, v2: 0)
            print("res:",res)
    
        }catch  let SomeError.illegalArg(msg){
            print("参数异常:",msg)
        }catch  let SomeError.outOfBounds(size, index){
            print("下标越界:","size = \(size)","index = \(index)")
        }catch  let outOfMemory{
            print("内存溢出")
        }catch{
            print("其他错误")
        }
        print("4")
    }
    

    【打印结果】:

    1
    2
    参数异常: 0不能作为除数
    4

    方式2

    func test(){
        print("1")
        do{
            print("2")
            let res = try divide(v1: 10, v2: 0)
            print("res:",res)
    
        }catch let error{
            switch error {
                case let SomeError.illegalArg(msg):
                    print("参数异常:",msg)
                default:
                    print("11")
            }
        }
        print("4")
    }
    

    方式3,4

    // 直接抛给上层
    func test2() throws {
            let res = try divide(v1: 10, v2: 0)
            print("res:",res)
    }
    test2()
    // 除SomeError错误类型外,其他抛给上层
    func test3() throws {
        do{
            print("2")
            let res = try divide(v1: 10, v2: 0)
            print("res:",res)
        }catch is SomeError{
            print("SomeError")
    
        }
    }
    
    

    3 try? try!

    • 可以使用try?、try!调用可能会抛出Error的函数,这样就不用去处理Error
    var result1 = try? divide(v1: 20, v2: 2)//Optional(10) 
    var result2 = try? divide(v1: 20, v2: 0)//nil 
    var result3 = try! divide(v1: 20, v2: 2)//10
    print(result1,result2,result3)//Optional(10) nil 10
    

    4 rethrows

    • rethrow 表明,函数本身不会抛出错误,但调用闭包参数抛出错误,那么他会将错误向上抛
    func exec(_ fn:(Int, Int) throws -> Int, _ num1: Int, _ num2: Int) rethrows {
        print(try fn(num1,num2))
    }
    //Fatal error: Error raised at top level:
    try exec(divide, 20, 0)
    

    5 defer

    • defer语句:用来定义以任何方式(抛错误、returen等)离开代码块之前必须要执行的代码
    • defer语句将延迟至当前作用域结束之前执行
    func processFile(){
        try divide(v1: 10, v2: 0)
        defer{
            print("defer")//即便divide报错,也会执行defer
        }
    }
    
    • defer 语句的执行顺序与定义顺序相反
    func fun1() {
        print("f1")
    }
    func fun2() {
        print("f2")
    }
    func testFn(){
        defer { fun1() }
        defer { fun2() }
    }
    testFn()
    

    【打印结果】:

    f2
    f1

    相关文章

      网友评论

          本文标题:Swift 错误捕捉及处理⑪

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