第八章:错误处理 Error Handling
8.9 高阶函数和错误 Higher-Order Functions and Errors
本小节主要讲了在遇到异步耗时操作
可能抛出错误
时候的处理。(书中也提到了并没有什么完美
的处理,只有对应不同场景相对合适
一些的处理方式)
对这个知识点做一个简单了解就行。
先引入一个问题
假设方法compute
是一个耗时操作
,一般我们会使用闭包
去异步的拿到返回值。
func compute(callback: Int -> ())复制代码
那么,如果。 compute方法可能会抛错捏
? 而且正好我们想要拿到这个错误的详细信息
。
一般情况下我们会这样写
func compute(callback: Int throws -> ())复制代码
一眼望去老铁这样写妥妥没毛病
啊(哈哈其实我也是这么觉得的。)
这样写现在并不是指计算可能失败
,而是表示回调本身可能会抛出错误
。
下面我们再回顾一下很久很久之前的知识点:
可选值
和 Result
作用于类型
,而 throws
只对函数
起效。将一个函数标注为 throws 意味着这个函数可能会失败.
我们真正需要的是用一个Result 来封装 Int 参数
的函数去解决我们上面的需求。
func compute(callback: Result -> ())复制代码
知识点: 对于异步的错误处理来说,Result 可能会是更好的选择,但是如果你已经在你的同步方法中使用throws了
,再去你的异步函数中使用Result 会让你的API使用起来更加困难
。
如果你只有一个回调
的话,使用下面这种会友好一些:
func compute { (theResult: () throws -> Int) in do { let result = try theResult() print ( result ) } catch { print("An error happened: \(error)") } }复制代码