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

第八章:錯誤處理 Error Handling

8.9 高階函數和錯誤 Higher-Order Functions and Errors

本小節主要講了在遇到異步耗時操做可能拋出錯誤時候的處理。(書中也提到了並無什麼完美的處理,只有對應不一樣場景相對合適一些的處理方式)git

對這個知識點作一個簡單瞭解就行。github

先引入一個問題

假設方法compute是一個耗時操做,通常咱們會使用閉包去異步的拿到返回值。閉包

func compute(callback: Int -> ())
複製代碼

那麼,若是。 compute方法可能會拋錯捏? 並且正好咱們想要拿到這個錯誤的詳細信息app

通常狀況下咱們會這樣寫異步

func compute(callback: Int throws -> ())
複製代碼

一眼望去老鐵這樣寫妥妥沒毛病啊(哈哈其實我也是這麼以爲的。)
but!!!函數

這樣寫如今並非指計算可能失敗,而是表示回調自己可能會拋出錯誤spa

下面咱們再回顧一下好久好久以前的知識點:

可選值Result 做用於類型,而 throws 只對函數起效。將一個函數標註爲 throws 意味着這個函數可能會失敗.code

咱們真正須要的是用一個Result 來封裝 Int 參數 的函數去解決咱們上面的需求。get

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)")
    } 
}
複製代碼

文章源文件地址,你們若是有更好的想法和觀點歡迎交流

相關文章
相關標籤/搜索