2016-09-21 36 views
10

當在Swift 3中調用函數throws時,必須詳盡地捕捉所有可能的錯誤,這通常意味着在最後有一個不必要的額外的catch {}來處理不會發生的錯誤。我可以限制函數在Swift中引發的類型嗎?

是否有可能說throws MyErrorType,以便編譯器可以知道在處理該枚舉中的所有情況時確實已經詳盡無遺?

+4

不,你不能...... –

+1

相關: http://stackoverflow.com/questions/30740997/what-is-the-difference-between-swift-2-0-do-try-catch-and-regular-java-cc-ex。 –

回答

2

有沒有簡單的方法是類型安全的拋出錯誤。考慮到這一點,如果編譯器允許你指定throws MyErrorType,那麼它也必須確保在那個函數體內你不是一個可能在do/catch塊之外拋出不同類型的函數。 (好吧,但它會增加不必要的複雜層次)。當推斷類型時,Swift編譯器可能已經很慢並且陷入循環中,推斷拋出類型一直到拋出函數鏈可能是一場噩夢。

正在運行的想法是,對於大多數錯誤,無論如何你都要以小部分方式處理它們。

話雖這麼說,沒有必要爲你增添額外catch let error as MyErrorType條款,你可以簡單地在一個catch塊使用一個開關,像這樣:

do { 
    try something() 
} catch let e { 
    switch e { 
    case let m as MyErrorType: handleMyError(m) 
    case let o as OtherErrorType: handleOther(o) 
    case is ThirdErrorType: print("error \(e)") 
    default: handleElse(e) 
    } 
} 
相關問題