錯誤處理 Error Handling
8.5 錯誤和函式引數 Errors and Function Parameters
本小節主要對下面兩個demo的統一抽象封裝引出來的一些思路。
1.檢視某一系列檔案的有效性
2.看一個數字陣列中所有數字是不是都不是質數
因為檢查是不是質數不會報錯,而檢查檔案可能會throws異常,從而引出rethrow
關鍵字。
Demo1.一系列檔案有效性的檢查
檢查一個檔案的有效性checkFile方法應該有三種情況,有效
,無效
,檢查出錯
Demo中 用一個for迴圈確認每一個檔案的有效性,遇到無效檔案或者檢查出錯都會提前退出迴圈
。
///檢查檔案有效性的方法
func checkFile(filename: String) throws -> Bool
func checkAllFiles(filenames: [String]) throws -> Bool {
for filename in filenames {
guard try checkFile(filename: filename) else { return false } }
return true
}
複製程式碼
Demo2.檢查一個數字陣列中是否含有質數 和Demo1相似,但不會throws異常
func checkPrimes(_ numbers: [Int]) -> Bool {
for number in numbers {
guard number.isPrime else { return false }
}
return true
}
checkPrimes([2,3,7,17]) // true
checkPrimes([2,3,4,5]) // false
複製程式碼
作為一個優秀的高階開發工程師
(碼農。。) 肯定會對這兩個高度相似的方法是做一個完美的封裝
我們暫定封裝的方法方法名叫all()
, all方法的引數是一個判斷條件是否滿足的函式
。
extension Sequence {
/// Returns `true` iff all elements satisfy the predicate
func all(condition: (Iterator.Element) -> Bool) -> Bool {
for element in self {
guard condition(element) else { return false }
}
return true
}
}
複製程式碼
下面我們開始享受我們封裝完之後的戰果了。
檢視是否有質數 一行程式碼搞定。
func checkPrimes2(_ numbers: [Int]) -> Bool {
return numbers.all { $0.isPrime }
}
複製程式碼
Rethrows 關鍵字
下面問題就來了,檢視有限檔案時可能會異常。這個封裝不好使啊~
這個時候我們可以使用rethrows關鍵字
rethrows關鍵字作用
: 告訴編譯器,這個函式只會在它的引數函式拋錯時拋錯
編譯器可以避免我們一定要用try呼叫。
extension Sequence {
func all(condition: (Iterator.Element) throws -> Bool) rethrows
-> Bool {
for element in self {
guard try condition(element) else { return false }
}
return true
}
}
複製程式碼
上面檢查質數的Demo不受影響,而且檢查檔案有效性就可以像下面這樣寫了
///有try了
func checkAllFiles(filenames: [String]) throws -> Bool {
return try filenames.all(condition: checkFile)
}
複製程式碼
知識點:標準庫中序列和集合幾乎所有可以接收函式做引數的函式
都被標記成rethrows了。 這樣做就很穩了~
over~