Swift 錯(cuò)誤處理狂巢、異常拋出

前言

? ?剛開始學(xué)習(xí)編程的時(shí)候撑毛,只考慮在對(duì)的情況下,該怎么去寫我們的程序唧领,但真正開始著手寫項(xiàng)目程序時(shí)藻雌,在遇到異常的情況下,我們的程序是否能健康的運(yùn)行就變的更加的重要斩个。
? ?學(xué)習(xí)Swift就要跟OC相比胯杭,在OC中處理異常的方法是,在方法中傳入一個(gè)error的指針地址受啥,方法執(zhí)行后,如果有錯(cuò)誤做个,內(nèi)部就會(huì)給error賦值鸽心。OC中異常處理的效率很低,通常情況下當(dāng)程序出現(xiàn)錯(cuò)誤時(shí)我們才會(huì)主動(dòng)的拋出異常居暖。Swift是蘋果在OC之后發(fā)布的新的語(yǔ)言顽频,兩種語(yǔ)言做的事情相同,但Swift做了很多的優(yōu)化和改動(dòng)太闺,在異常處理方面糯景,Swift提供了一套完整的異常處理。下面就記錄一下Swift的錯(cuò)誤處理省骂。

Swift錯(cuò)誤處理

? ?Swift中會(huì)用throws關(guān)鍵字來(lái)表示一個(gè)方法會(huì)拋出異常蟀淮,采用Error協(xié)議來(lái)表示錯(cuò)誤的類型,通過(guò)do - try - catch的方式來(lái)處理可能會(huì)拋出的異常钞澳。下面開始碼代碼怠惶,看看是如何使用的。

  • Swift異常通常會(huì)想到Optional略贮,Optional是新增的數(shù)據(jù)類型可選值類型甚疟,他可以有值仗岖,也可以無(wú)值逃延,當(dāng)沒(méi)有值時(shí),就為nil轧拄。在OC中nil是可以被訪問(wèn)的揽祥,而Swift是不被允許的。這樣當(dāng)你對(duì)Optional進(jìn)行強(qiáng)行拆包使用時(shí)檩电,就會(huì)造成程序的異常拄丰,這里就需要你進(jìn)行一下錯(cuò)誤的處理,對(duì)nil進(jìn)行處理俐末。關(guān)于Optional也是Swift比較基礎(chǔ)的知識(shí)料按,我也會(huì)后續(xù)進(jìn)行記錄。

Error協(xié)議

??Error是一個(gè)空協(xié)議卓箫,是用來(lái)表示錯(cuò)誤的類型载矿。NSError和CFError都遵循了這個(gè)協(xié)議。首先我們用枚舉來(lái)定一個(gè)錯(cuò)誤異常烹卒。如下:

enum TestError: Error{
    case ErrorOne (String)
    case ErrorTwo (String)
    case ErrorThree (String)
    case ErrorOther (String)
}
//這里枚舉是非常適合處理Error的數(shù)據(jù)類型

throws關(guān)鍵字

??錯(cuò)誤的枚舉定好了之后闷盔,我們要寫個(gè)使用這些錯(cuò)誤的方法,方法可以主動(dòng)拋出錯(cuò)誤旅急,這里就用到了throws關(guān)鍵字了逢勾。看代碼:

//根據(jù)參數(shù)number拋出不同的錯(cuò)誤
func throwErrorFun(number: Int) throws {
    if number == 0 {
        print("OK")
    } else if number == 1 {
        throw TestError.ErrorOne("錯(cuò)誤1")
    } else if number == 2 {
        throw TestError.ErrorTwo("錯(cuò)誤2")
    } else if number == 3 {
        throw TestError.ErrorThree("錯(cuò)誤3")
    } else {
        throw TestError.ErrorOther("其他")
    }
}
  • 當(dāng)一個(gè)方法可以拋出異常藐吮,需要在定義這個(gè)方法時(shí)溺拱,在 ->ReturnType 前加上 throws 進(jìn)行修飾逃贝。

do - try - catch 捕獲處理錯(cuò)誤

??接下來(lái)時(shí)調(diào)用會(huì)拋出異常函數(shù)。用 do - try - catch 來(lái)捕獲處理錯(cuò)誤迫摔∏镉荆看代碼:

//調(diào)用方法
do {
    try throwErrorFun(number: 10)
} catch TestError.ErrorOne(let discription) {
    print(discription)
} catch TestError.ErrorTwo(let discription) {
    print(discription)
} catch TestError.ErrorThree(let discription) {
    print(discription)
} catch TestError.ErrorOther(let discription) {
    print(discription)
}
  • 可以看到在do里面進(jìn)行正常函數(shù)調(diào)用操作,注意在調(diào)用可拋出異常的函數(shù)前要加上try修飾攒菠,然后用catch來(lái)捕獲異常進(jìn)行處理迫皱。當(dāng)然如果不需要區(qū)分每一個(gè)error可以這樣寫:
do {
    try throwErrorFun(number: 10)
} catch let error {
    print(error)
}
  • 關(guān)于try,當(dāng)可拋出異常的函數(shù)為有返回值的函數(shù)時(shí)辖众,也可以在調(diào)用函數(shù)的前面加上try?卓起,將結(jié)果轉(zhuǎn)換成可選值(Optional)來(lái)進(jìn)行處理,這跟Optional判斷非空處理是一樣的凹炸,不做代碼介紹戏阅。

Result類型

??Result類型是另一種可以處理錯(cuò)誤的方法,函數(shù)的執(zhí)行啤它,要么成功返回出數(shù)據(jù)奕筐,要么失敗,失敗就返回出錯(cuò)誤信息变骡,這樣我們就可以用Result類型來(lái)處理离赫。寫個(gè)例子:

//對(duì)上面的函數(shù)進(jìn)行修改
func throwErrorFunTest(number: Int) -> Result<String> {
    guard number == 0 else {
        if number == 1 {
            return .failure(TestError.ErrorOne("錯(cuò)誤1"))
        } else if number == 2 {
            return .failure(TestError.ErrorTwo("錯(cuò)誤2"))
        } else if number == 3 {
            return .failure(TestError.ErrorThree("錯(cuò)誤3"))
        } else {
            return .failure(TestError.ErrorOther("其他錯(cuò)誤"))
        }
    }
    return .success("成功")
}

//調(diào)用
let result = throwErrorFunTest(number: 2)

switch result {
case .success(let message):
    print(message)
case .failure(let error):
    print(error)
}
  • 這樣就不需要用do -try - catch來(lái)包裹你的代碼。Resul類型我理解還不夠塌碌,還需要進(jìn)一步去研究渊胸,搜索Result類型,好像在Promise中用的很多台妆,接下來(lái)可以去研究一下PromisKit,感覺(jué)能有比較多的收獲翎猛。這些之后再記錄吧。

最后了

??好了接剩,關(guān)于Swift的錯(cuò)誤處理我就記錄到這里了切厘,當(dāng)然我覺(jué)得我記錄和了解的東西都是一些皮毛,關(guān)于錯(cuò)誤處理還有更多高深的東西需要去理解懊缺,希望大家一起去挖掘吧疫稿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桐汤,隨后出現(xiàn)的幾起案子而克,更是在濱河造成了極大的恐慌,老刑警劉巖怔毛,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件员萍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拣度,警方通過(guò)查閱死者的電腦和手機(jī)碎绎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門螃壤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人筋帖,你說(shuō)我怎么就攤上這事奸晴。” “怎么了日麸?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵寄啼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我代箭,道長(zhǎng)墩划,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任嗡综,我火速辦了婚禮乙帮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘极景。我一直安慰自己察净,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布盼樟。 她就那樣靜靜地躺著氢卡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恤批。 梳的紋絲不亂的頭發(fā)上异吻,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音喜庞,去河邊找鬼。 笑死棋返,一個(gè)胖子當(dāng)著我的面吹牛延都,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睛竣,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼晰房,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了射沟?” 一聲冷哼從身側(cè)響起殊者,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎验夯,沒(méi)想到半個(gè)月后猖吴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挥转,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年海蔽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了共屈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡党窜,死狀恐怖拗引,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情幌衣,我是刑警寧澤矾削,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站豁护,受9級(jí)特大地震影響怔软,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜择镇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一挡逼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腻豌,春花似錦家坎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至苏携,卻和暖如春做瞪,著一層夾襖步出監(jiān)牢的瞬間右冻,已是汗流浹背装蓬。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纱扭,地道東北人牍帚。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乳蛾,于是被迫代替她去往敵國(guó)和親暗赶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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