第八章:錯誤處理 Error Handling
8.9 高階函式和錯誤 Higher-Order Functions and Errors
本小節主要講了在遇到非同步耗時操作
可能丟擲錯誤
時候的處理。(書中也提到了並沒有什麼完美
的處理,只有對應不同場景相對合適
一些的處理方式)
對這個知識點做一個簡單瞭解就行。
先引入一個問題
假設方法compute
是一個耗時操作
,一般我們會使用閉包
去非同步的拿到返回值。
func compute(callback: Int -> ())
複製程式碼
那麼,如果。
compute方法可能會拋錯捏
?
而且正好我們想要拿到這個錯誤的詳細資訊
。
一般情況下我們會這樣寫
func compute(callback: Int throws -> ())
複製程式碼
一眼望去老鐵這樣寫妥妥沒毛病
啊(哈哈其實我也是這麼覺得的。)
but!!!
這樣寫現在並不是指計算可能失敗
,而是表示回撥本身可能會丟擲錯誤
。
下面我們再回顧一下很久很久之前的知識點:
可選值
和 Result
作用於型別
,而 throws
只對函式
起效。將一個函式標註為 throws 意味著這個函式可能會失敗.
我們真正需要的是用一個Result 來封裝 Int 引數
的函式去解決我們上面的需求。
func compute(callback: Result<Int> -> ())
複製程式碼
知識點: 對於非同步的錯誤處理來說,Result 可能會是更好的選擇,但是如果你已經在你的同步方法中使用throws了
,再去你的非同步函式中使用Result 會讓你的API使用起來更加困難
。
如果你只有一個回撥
的話,使用下面這種會友好一些:
func compute { (theResult: () throws -> Int) in
do {
let result = try theResult()
print ( result )
} catch {
print("An error happened: \(error)")
}
}
複製程式碼