3 回答

TA貢獻1779條經驗 獲得超6個贊
Swift 2錯誤處理模型有兩個重要方面:詳盡性和彈性。它們一起歸結為您的do/ catch語句,需要捕獲所有可能的錯誤,而不僅僅是您知道可以拋出的錯誤。
請注意,您并未聲明函數會拋出什么類型的錯誤,僅聲明它是否會拋出任何類型的錯誤。這是一個零一無窮的問題:當有人為其他人(包括您將來的自己)定義一個函數供您使用時,您不需要使函數的每個客戶端都適應您實現中的每個更改功能,包括可能引發的錯誤。您希望調用您的函數的代碼能夠適應這種變化。
因為您的函數無法說出它拋出的錯誤類型(或將來可能拋出的錯誤),所以catch捕獲該錯誤的塊不知道它可能拋出的錯誤類型。因此,除了處理您所知道的錯誤類型之外,您還需要使用通用catch語句來處理那些您不知道的錯誤類型-這樣,如果您的函數更改了將來拋出的錯誤集,則調用方仍將捕獲該錯誤類型。錯誤。
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
print("Not me error")
} catch SandwichError.DoItYourself {
print("do it error")
} catch let error {
print(error.localizedDescription)
}
但是,我們不要就此止步。再考慮一下這種彈性思想。設計三明治的方式必須在使用它們的每個地方描述錯誤。這意味著每當更改錯誤案例集時,都必須更改使用它們的每個位置……這不是很有趣。
定義自己的錯誤類型的想法是讓您集中處理這樣的事情。您可以description為錯誤定義一個方法:
extension SandwichError: CustomStringConvertible {
var description: String {
switch self {
case NotMe: return "Not me error"
case DoItYourself: return "Try sudo"
}
}
}
然后,您的錯誤處理代碼可以要求您的錯誤類型進行自我描述-現在,您處理錯誤的每個地方都可以使用相同的代碼,并且還可以處理將來可能發生的錯誤情況。
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch let error as SandwichError {
print(error.description)
} catch {
print("i dunno")
}
這也為錯誤類型(或其擴展)支持其他報告錯誤的方式鋪平了道路-例如,您可以在錯誤類型上具有擴展名,該擴展名知道如何呈現UIAlertController用于向iOS用戶報告錯誤的方式。

TA貢獻1797條經驗 獲得超4個贊
Swift擔心您的case語句不能涵蓋所有情況,要解決該問題,您需要創建一個默認case:
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
print("Not me error")
} catch SandwichError.DoItYourself {
print("do it error")
} catch Default {
print("Another Error")
}
- 3 回答
- 0 關注
- 1049 瀏覽
添加回答
舉報