美文网首页
swift 错误处理

swift 错误处理

作者: 皆为序幕_ | 来源:发表于2019-05-09 18:24 被阅读0次

    表示并抛出错误

    • 在 Swift 中,定义错误的类型需要遵循 Error 协议
    • 通常用枚举表示错误类型,因为它能更直观的表达当前错误类型的每种错误细节
    enum MyError:Error {
        case errorA
        case errorB
        //实现Error协议
        var errorDescription:String{
            if self == .errorA{
                return "errorA"
            }else{
                return "errorB"
            }
        }
    }
    
    print(MyError.errorA.errorDescription)  //errorA
    

    处理错误(有4种处理错误的方式)

    用 throwing 函数传递错误

    • 为了表示一个函数或方法可以抛出错误,在函数声明的参数列表之后加上throws关键字
    • 标有throws关键字的函数被称作throwing 函数
    • 如果这个函数指明了返回值类型,throws关键词需要写在箭头(->)的前面
    enum MyError:Error {
        case errorA
        case errorB
        //实现Error协议
        var errorDescription:String{
            if self == .errorA{
                return "errorA"
            }else{
                return "errorB"
            }
        }
    }
    
    func showError(value:Int) throws -> Int {
        if value == 0{
            throw MyError.errorA
        }else if value == 1{
            throw MyError.errorB
        }
        return value
    }
    
    // 对于任一可能会抛出错误的函数
    // 在调用前面都必须添加try关键字
    let ref = try? showError(value: 1)
    print(ref as Any)  //nil
    let ref = try? showError(value: 2)
    print(ref as Any)  //2
    

    用do-catch语句处理错误

    使用do- catch语句通过运行代码块来处理错误。如果do的句子中的代码抛出错误,则将其与catch子句进行匹配,以确定它们中的哪一个可以处理错误

    do {
        var value = try showError(value: 0)
        print(value)
    } catch MyError.errorA {
        print("errorA")  //errorA
    } catch {
        print("errorC")
    }
    

    将错误作为可选类型处理

    使用try?将错误转换为可选值来处理错误
    如果在try?表达式时抛出错误,则表达式的值为nil

    let value = try? showError(value: 0)
    print(value)   //nil
    

    禁用错误传播

    使用try!来禁止错误传递,这种方式会把错误放在运行时断言中,如果真的抛出错误,将收到运行时错误

    error.png

    指定清理操作

    • defer语句将代码的执行延迟到当前的作用域退出之前
    • 该语句由defer关键字和要被延迟执行的语句组成,延迟执行的语句不能包含任何控制转移语句,例如breakreturn语句、抛出一个错误
    • 延迟执行的操作会按照它们声明的顺序从后往前执行——也就是说,第一条defer语句中的代码最后才执行,第二条defer语句中的代码倒数第二个执行,以此类推。最后一条语句会第一个执行
    • 即使没有涉及到错误处理,也可以使用defer语句
    var lockState = false
    func room() -> Bool{
        lockState = true
        print(lockState)
        defer {
            lockState = false
        }
        return lockState
    }
    
    print(lockState)  //false
    self.room()  //true
    print(lockState)  //false
    
    

    相关文章

      网友评论

          本文标题:swift 错误处理

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