swift4.0 錯(cuò)誤處理

對(duì)于大部分現(xiàn)代化面向?qū)ο蟮木幊陶Z(yǔ)言都擁有結(jié)構(gòu)化的錯(cuò)誤處理語(yǔ)法特性渊季,swift也不例外。當(dāng)我們?cè)谝粋€(gè)方法或函數(shù)中實(shí)現(xiàn)某些功能時(shí),如果遇到錯(cuò)誤的用戶輸入則可能導(dǎo)致嚴(yán)重的異常問(wèn)題纵柿,此時(shí)我們可以選擇通過(guò)拋出異常的方式,將此錯(cuò)誤送給函數(shù)調(diào)用者启绰。

我們常用 try-catch 結(jié)構(gòu)昂儒,不過(guò)在swift編程語(yǔ)言中沒(méi)有引入專門的 try 語(yǔ)句塊,而是直接調(diào)用之前的 do 語(yǔ)句塊委可,僅僅將 try 作為拋出異常的函數(shù)或方法的標(biāo)識(shí)渊跋,然后在 do 語(yǔ)句塊后接 catch 語(yǔ)句塊捕獲錯(cuò)誤并進(jìn)行處理。

do {
    let str = try String(contentsOfFile: "/Users/zennychen/Desktop/test.txt", encoding: String.Encoding.ascii)
    print("content is: \(str)")
}
catch {
    print("file read failed!")
}

第一節(jié) swift中錯(cuò)誤的表示

在 swift 中如果我們要定義一個(gè)表示錯(cuò)誤的類型非常簡(jiǎn)單,只要遵循 Error 協(xié)議就可以了拾酝,我們通常用枚舉或結(jié)構(gòu)體來(lái)表示錯(cuò)誤類型燕少,枚舉可能用的多些,因?yàn)樗芨庇^的表達(dá)當(dāng)前錯(cuò)誤類型的每種錯(cuò)誤細(xì)節(jié)微宝。

當(dāng)我們定義了一個(gè)錯(cuò)誤類型之后棺亭,可以實(shí)現(xiàn) Error 協(xié)議中擴(kuò)展默認(rèn)實(shí)現(xiàn)的只讀屬性 localizedDescription,用于描述當(dāng)前錯(cuò)誤對(duì)象的詳細(xì)信息

/// 定義一個(gè)枚舉類型的錯(cuò)誤類型
enum MyEnumError: Error {
    case errorOne
    case errorTwo
    /// 實(shí)現(xiàn)Error協(xié)議的localizedDescription只讀實(shí)例屬性
    var localizedDescription: String {
        let desc = self == .errorOne ? "the first errror" : "the second error"
        return "\(self): \(desc)"
    }
}
 
/// 定義一個(gè)結(jié)構(gòu)體類型的錯(cuò)誤類型
struct MyStructError: Error {
    var errCode: Int = 0
    /// 實(shí)現(xiàn)Error協(xié)議的localizedDescription只讀實(shí)例屬性
    var localizedDescription: String {
        return "The error code is: \(errCode)"
    }
}
 
print("The enum error is: \(MyEnumError.errorOne.localizedDescription)")
print("The struct error is: \(MyStructError().localizedDescription)")

第二節(jié) swift中的錯(cuò)誤拋出

如果我們?cè)谝粋€(gè)函數(shù)或方法中可能要拋出一個(gè)錯(cuò)誤蟋软,那么我們必須在該函數(shù)的形參列表后面镶摘,返回類型前面(即 -> 前面)添加 throws 關(guān)鍵字,以顯示告訴編譯器岳守,該函數(shù)可能會(huì)拋出錯(cuò)誤凄敢。

/// 定義一個(gè)foo函數(shù),
/// 它可能會(huì)拋出一個(gè)錯(cuò)誤湿痢,
/// 因此這里用throws限定涝缝。
/// 注意throws的位置
func foo(a: Int) throws -> Int {
    if a < -10 {
        // 如果a的值小于-10,
        // 則拋出MyEnumError.errorOne
        throw MyEnumError.errorOne
    }
    else if a > 10 {
        // 如果a的值大于10譬重,
        // 則拋出MyEnumError.errorTwo
        throw MyEnumError.errorTwo
    }
    else if a == 0 {
        // 如果a的值為0拒逮,
        // 那么拋出MyStructError對(duì)象,
        // 并且其errCode的值為-1
        throw MyStructError(errCode: -1)
    }
     
    print("a = \(a)")
     
    return a
}
 
// ref的類型為:(Int) throws -> Void
let ref = foo(a:)

第三節(jié) 錯(cuò)誤捕獲與處理

在Swift 編程語(yǔ)言中我們使用 do-catch 塊對(duì)錯(cuò)誤進(jìn)行捕獲臀规,當(dāng)我們?cè)谡{(diào)用一個(gè) throws 聲明的函數(shù)或方法時(shí)滩援,我們必須把調(diào)用語(yǔ)句放在 do 語(yǔ)句塊中,同時(shí) do 語(yǔ)句塊后面緊接著使用 catch 語(yǔ)句塊塔嬉。

當(dāng)我們?cè)?do 語(yǔ)句塊中調(diào)用了一個(gè)可能會(huì)拋出錯(cuò)誤的函數(shù)時(shí)玩徊,而此時(shí)該函數(shù)在執(zhí)行時(shí)確實(shí)拋出了錯(cuò)誤,我們?cè)?catch 語(yǔ)句塊匯總可以捕獲錯(cuò)誤并進(jìn)行處理谨究,一旦 do 語(yǔ)句塊中拋出錯(cuò)誤恩袱,接下來(lái)的代碼將不會(huì)被執(zhí)行,會(huì)跳到 catch 語(yǔ)句塊中胶哲,catch 語(yǔ)句塊中的代碼執(zhí)行完成后畔塔,其下面的代碼也會(huì)執(zhí)行,如果 do 語(yǔ)句塊中無(wú)錯(cuò)誤拋出鸯屿,catch 語(yǔ)句塊不會(huì)被執(zhí)行澈吨。

// 由于在以下語(yǔ)句中包含了對(duì)可拋出錯(cuò)誤的函數(shù)調(diào)用,
// 因此這里使用do語(yǔ)句塊將這些調(diào)用圍起來(lái)
do {
    // 對(duì)于任一可能會(huì)拋出錯(cuò)誤的函數(shù)碾盟,
    // 在調(diào)用前面都必須添加try關(guān)鍵字
    var value = try foo(a: -100)
    value += try foo(a: 100)
    value += try foo(a: 0)
     
    print("value = \(value)")
}   // 下面緊接著使用catch語(yǔ)句塊
catch let err {
    // 如果在do語(yǔ)句塊中有任一錯(cuò)誤拋出棚辽,
    // 那么即會(huì)執(zhí)行此catch語(yǔ)句塊中的內(nèi)容
    print("err is: \(err)")
}
 
// 無(wú)論上面do語(yǔ)句塊是否有錯(cuò)誤,
// 這句打印均會(huì)執(zhí)行
print("complete") 

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末冰肴,一起剝皮案震驚了整個(gè)濱河市屈藐,隨后出現(xiàn)的幾起案子榔组,更是在濱河造成了極大的恐慌,老刑警劉巖联逻,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搓扯,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡包归,警方通過(guò)查閱死者的電腦和手機(jī)锨推,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)公壤,“玉大人换可,你說(shuō)我怎么就攤上這事∠梅” “怎么了沾鳄?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)确憨。 經(jīng)常有香客問(wèn)我译荞,道長(zhǎng),這世上最難降的妖魔是什么休弃? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任吞歼,我火速辦了婚禮,結(jié)果婚禮上塔猾,老公的妹妹穿的比我還像新娘篙骡。我一直安慰自己,他們只是感情好桥帆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布医增。 她就那樣靜靜地躺著慎皱,像睡著了一般老虫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上茫多,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天祈匙,我揣著相機(jī)與錄音,去河邊找鬼天揖。 笑死夺欲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的今膊。 我是一名探鬼主播些阅,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼斑唬!你這毒婦竟也來(lái)了市埋?” 一聲冷哼從身側(cè)響起黎泣,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缤谎,沒(méi)想到半個(gè)月后抒倚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坷澡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年托呕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片频敛。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡项郊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斟赚,到底是詐尸還是另有隱情呆抑,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布汁展,位于F島的核電站鹊碍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏食绿。R本人自食惡果不足惜侈咕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望器紧。 院中可真熱鬧耀销,春花似錦、人聲如沸铲汪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掌腰。三九已至漓骚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晕城,已是汗流浹背叠纷。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勺择,地道東北人创南。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像省核,于是被迫代替她去往敵國(guó)和親稿辙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 本章將會(huì)介紹 自動(dòng)引用計(jì)數(shù)的工作機(jī)制自動(dòng)引用計(jì)數(shù)實(shí)踐類實(shí)例之間的循環(huán)強(qiáng)引用解決實(shí)例之間的循環(huán)強(qiáng)引用閉包引起的循環(huán)強(qiáng)...
    寒橋閱讀 898評(píng)論 0 0
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)芥备,也就是一...
    悟名先生閱讀 4,132評(píng)論 0 13
  • 登高望海 極目遼遠(yuǎn) 云氣氤氳處 仙島隱約 熟悉的人物紛紛復(fù)活寒暄 冰雪流動(dòng)成血液 云朵蹁躚為骨骼 身影輕盈好似在舞...
    樹(shù)梢的雪閱讀 276評(píng)論 0 2
  • 匆匆穿入人流冬耿,匆匆開(kāi)始生活的一切,匆匆走進(jìn)這個(gè)神圣和向往的都市萌壳! 將難忘的故事匯入一個(gè)旅人的心跡亦镶,把人生的夢(mèng)擁入心...
    黑土地_6345閱讀 429評(píng)論 1 6
  • 曾幾何時(shí),我的心便開(kāi)始腐朽了袱瓮,無(wú)論我怎么給她澆水施肥缤骨,她都熟視無(wú)睹,不肯汲取尺借、也不愿吐露绊起,迷惘的我只聽(tīng)見(jiàn)她說(shuō):生命...
    編者唯閱讀 298評(píng)論 0 1