亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Swift do-try-catch語法

Swift do-try-catch語法

慕容708150 2019-10-24 14:22:33
我嘗試理解Swift 2中新的錯誤處理方法。這是我做的:我首先聲明了一個錯誤枚舉:enum SandwichError: ErrorType {    case NotMe    case DoItYourself}然后我聲明了一個引發錯誤的方法(伙計們不是異常。這是一個錯誤。)。這是該方法:func makeMeSandwich(names: [String: String]) throws -> String {    guard let sandwich = names["sandwich"] else {        throw SandwichError.NotMe    }    return sandwich}問題出在主叫方。這是調用此方法的代碼:let kitchen = ["sandwich": "ready", "breakfeast": "not ready"]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")}之后,do行編譯器說Errors thrown from here are not handled because the enclosing catch is not exhaustive。但我認為這是詳盡無遺的,因為SandwichError枚舉中只有兩種情況。對于常規的switch語句,swift可以理解,在處理每種情況時,它都是詳盡的。
查看完整描述

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用戶報告錯誤的方式。


查看完整回答
反對 回復 2019-10-24
?
繁星coding

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")

}


查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 1049 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號