前言
? ?剛開始學(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ò)誤處理還有更多高深的東西需要去理解懊缺,希望大家一起去挖掘吧疫稿。