swift3 错误和异常处理

本文是 swifter-tips 的笔记

异常 和 错误

异常

异常往往是由程序员的错误导致的app无法继续运行。
例如:

  • 向一个无法响应某个消息的NSObject 对象发送了消息,会得到 NSInvalidArgumentException 的异常,并告诉
    程序员 ““unrecognized selector sent to instance”
  • 程序员使用一个超过数组元素数量的下标来试图访问 NSArray 的元素时,会得到 NSRangeException .

这种错误所导致的程序无法运行的问题是在开发阶段就全部解决的,而不应当出现在上架APP中。

错误

  • 由 NSError 代表的错误更多的指那些 “合理的”,用户在使用app中可能遇到的情况。
    例如:
  • 登录时候用户名密码验证后不匹配
  • 试图从某个文件中读取数据生成 NSData 对象时发生了问题(比如文件被意外修改了)等等

但 NSError 的使用方式其实在变相的鼓励开发者忽略错误。
例如:

[data writeToFile: path options: options error: nil];

在swift2.0 中 ,带有 NSError 指针作为参数的API 都被改成了可以抛出异常的形式。

open func write(toFile path: String, 
    options writeOptionsMask: NSData.WritingOptions) throws

使用方法为:

do {
    try d.write(toFile: "Hello", options: [])
} catch let error as NSError {
    print ("Error: \(error.domain)")
}

try 和 throws

try

  • try!标识强制执行,代表你确定知道这次调用不会抛出异常,如果调用中出现了移仓,程序崩溃。
  • try? 返回一个Optional值,如果运行成功,没有抛出错误,会返回一个包含这条语句的返回值,否者返回nil

throws

  • 在一个可以throw的方法里,我们永远不应该返回一个Optional的值。
  • 因为结合 try? 使用的话,这个 Optional 值将再次包装一层 Optional ,这种双重的 Optional 值 非常容易出现 错误。也十分迷惑。

rethrows

  • 和 throws 做的事情没有太多不同,都是标记了一个方法应该抛出错误
  • rethrows 一般用在参数中包含有可以 throws 的方法的高阶函数中,表示它既可以接受普通函数,也可以接受一个能throw的函数作为参数。
  • 可以将 rethrows 看做 throws 的 “子类”, rethrows 的方法可以用来重载那些被标记为 throws的方法或者参数。或用来满足被标记为 throws 的协议。
  • 如果不知道怎么用 :
    • 记住: 在要 throws 另一个 throws 时,应该将前者 改为 rethrows 。
  • 这样在不失灵活性的同时保证了 代码的 可读性和 准确性。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 相对自己说真的好糟糕,虽然这不是自己想要的生活,但一点办法也没有,只能这样将就下去。 加油,自己,父亲不在了,有两...
    久爱jiajia阅读 81评论 0 0
  • 第一次遇到《了不起的盖茨比》这部小说是在大学的美国文学课上,老师带领着我们读完了英文原著。 第二次相遇是因小李子主...
    绿水荡漾景天然阅读 665评论 1 4
  • 新版本默认并没有开启这个功能,需要单独开启
    panw3i阅读 309评论 0 0