3 回答

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

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個(gè)贊
Swift擔(dān)心您的case語句不能涵蓋所有情況,要解決該問題,您需要?jiǎng)?chuàng)建一個(gè)默認(rèn)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 關(guān)注
- 1048 瀏覽
添加回答
舉報(bào)