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