第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Swift do-try-catch語法

Swift do-try-catch語法

慕容708150 2019-10-24 14:22:33
我嘗試?yán)斫釹wift 2中新的錯(cuò)誤處理方法。這是我做的:我首先聲明了一個(gè)錯(cuò)誤枚舉:enum SandwichError: ErrorType {    case NotMe    case DoItYourself}然后我聲明了一個(gè)引發(fā)錯(cuò)誤的方法(伙計(jì)們不是異常。這是一個(gè)錯(cuò)誤。)。這是該方法:func makeMeSandwich(names: [String: String]) throws -> String {    guard let sandwich = names["sandwich"] else {        throw SandwichError.NotMe    }    return sandwich}問題出在主叫方。這是調(diào)用此方法的代碼: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。但我認(rèn)為這是詳盡無遺的,因?yàn)镾andwichError枚舉中只有兩種情況。對(duì)于常規(guī)的switch語句,swift可以理解,在處理每種情況時(shí),它都是詳盡的。
查看完整描述

3 回答

?
哆啦的時(shí)光機(jī)

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ò)誤的方式。


查看完整回答
反對(duì) 回復(fù) 2019-10-24
?
繁星coding

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

}


查看完整回答
反對(duì) 回復(fù) 2019-10-24
  • 3 回答
  • 0 關(guān)注
  • 1048 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)