前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >swift 错误处理

swift 错误处理

作者头像
xy_ss
发布2023-11-22 09:14:28
1120
发布2023-11-22 09:14:28
举报
文章被收录于专栏:浮躁的喧嚣

表示并抛出错误

  • 在 Swift 中,定义错误的类型需要遵循 Error 协议
  • 通常用枚举表示错误类型,因为它能更直观的表达当前错误类型的每种错误细节
代码语言:javascript
复制
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关键词需要写在箭头(->)的前面
代码语言:javascript
复制
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子句进行匹配,以确定它们中的哪一个可以处理错误

代码语言:javascript
复制
do {
    var value = try showError(value: 0)
    print(value)
} catch MyError.errorA {
    print("errorA")  //errorA
} catch {
    print("errorC")
}
将错误作为可选类型处理

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

代码语言:javascript
复制
let value = try? showError(value: 0)
print(value)   //nil
禁用错误传播

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

error.png


指定清理操作

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

print(lockState)  //false
self.room()  //true
print(lockState)  //false
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 表示并抛出错误
  • 处理错误(有4种处理错误的方式)
    • 用 throwing 函数传递错误
      • 用do-catch语句处理错误
        • 将错误作为可选类型处理
          • 禁用错误传播
          • 指定清理操作
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档