[swift 進階]讀書筆記-第八章:錯誤處理 C8P8 錯誤鏈 Chaining Errors

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

第八章:錯誤處理 Error Handling

8.8 錯誤鏈 Chaining Errors

本小節主要講了如何優雅的處理鏈式呼叫多個可能丟擲錯誤的方法。

其實swift 的內建(build-in)錯誤處理處理機制就已經很好的將鏈式呼叫可能拋錯的方法,我們直接用一個大的do/catch塊把這一段包裹住就行。
但是作為一個優秀的開發者,我們可以用更優雅的解決方案去處理這種場景。

還記得之前學的Result類麼? 我們可以通過Result類去包裝返回值,讓你的程式碼變得更加優雅 more elegant。

具體Demo如下

///未通過Result包裝error的檢查檔案和返回pid的方法
func checkFilesAndFetchProcessID(filenames: [String]) -> Int {
     do {
    try filenames.all(checkFile)
        let contents = try contentsOfFile("Pidfile") 
        return try optional(Int(contents),
        orError: ReadIntError.CouldNotRead) }
     catch {
        return 42 // 預設值 
    }
}

///通過Result包裝error的檢查檔案和返回pid的方法,毫無try catch 痕跡可言。 
func checkFilesAndFetchProcessID(filenames: [String]) -> Result<Int> { 
    return filenames
    . all (checkFile)
    .flatMap { _ in contentsOfFile("Pidfile") } 
    .flatMap { contents in
    Int ( contents).map(Result.Success) ?? .Failure(ReadIntError.CouldNotRead)
    } 
}
複製程式碼
注: 這裡實際上是通過一系列的flatMap方法去過濾掉error, 在實際開發中,我們可以通過同樣可以通過flatmap做很多關於去除nil的騷操作, 這個知識點之前有聽過瞄神提過。 忘了具體使用場景,知道同學們可以補充分享。 Thx~

相關文章