[swift 進階]讀書筆記-第八章:錯誤處理 C8P9 高階函式和錯誤

liaoWorking在掘金發表於2019-04-03

第八章:錯誤處理 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)")
    } 
}
複製程式碼

文章原始檔地址,大家如果有更好的想法和觀點歡迎交流

相關文章