Swift異常處理體現了函數式語言的特性。因此我們能夠傳一個會拋出異常的函數閉包(高階函數)作為參數傳到還有一個函數中(父函數),父函數能夠在子函數拋出異常時直接向上拋出異常,這時用rethrowkeyword表示引用閉包時拋出的異常。
throwkeyword和Java一樣,就是說調用這個函數本身可能會拋出異常。
rethrow能夠看作是throw的子集,Swift不把rethrow作為完整的類型。
比如一個函數不能同一時候用throw和rethrow拋出異常,高階函數閉包定義中也不能包括rethrow。
rethrow更像函數的屬性(相似@noreturn)。rethrow僅僅是在函數作為參數調用的上下文中才有意義。就是為了簡化語法的。
一個接受閉包作為參數的函數有以下三種throw選擇
1、throw異常,這表示這個函數可能會拋出異常。不管作為參數的閉包是否拋出異常
2、rethrow異常,這表示這個函數本身不會拋出異常,但假設作為參數的閉包拋出了異常。那么它會把異常繼續拋上去。比如
func map<T>(@noescape transform: (Generator.Element) throws -> T) rethrows -> [T]
3、不拋出異常,這表示這個函數會處理參數閉包的異常,或者不正確閉包進行運算。
當我們使用Swift異常處理時,應該不覺得它是拋出異常。而是返回不同的類型