本文是 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 。
- 这样在不失灵活性的同时保证了 代码的 可读性和 准确性。
网友评论