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 。
  • 这样在不失灵活性的同时保证了 代码的 可读性和 准确性。

你可能感兴趣的:(swift3 错误和异常处理)