你可以使用任何實(shí)現(xiàn)了 "Error" 協(xié)議的類型闸氮,來描述錯(cuò)誤鹦蠕。例:
使用 "throw" 關(guān)鍵字來拋出一個(gè)錯(cuò)誤士败,使用 "throws"來標(biāo)明一個(gè)函數(shù)可以拋出一個(gè)錯(cuò)誤嵌纲。如果你在一個(gè)函數(shù)中俘枫,拋出了一個(gè)錯(cuò)誤,函數(shù)立刻返回并且調(diào)用這個(gè)函數(shù)的代碼處理這個(gè)錯(cuò)誤逮走。例:
有幾個(gè)處理錯(cuò)誤的方法鸠蚪。一個(gè)方法是使用do-catch。在"do"的block中,你在可能拋出錯(cuò)誤的代碼前加上 "try" 來標(biāo)明茅信。在"catch"的block中盾舌,錯(cuò)誤自動(dòng)被命名為"error",除非你手動(dòng)給予一個(gè)別的名稱蘸鲸。例:
你可以提供多個(gè) "catch"的block來處理特定的錯(cuò)誤妖谴。就像在 switch中,你在case后寫上條件(范式) 酌摇,在catch后寫一個(gè)條件(范式)膝舅,來區(qū)分不同的錯(cuò)誤。例:
另一種處理錯(cuò)誤的方法是使用 "try?" 來將一個(gè)可選類型的結(jié)果進(jìn)行轉(zhuǎn)換窑多。如果函數(shù)拋出一個(gè)錯(cuò)誤仍稀,它的返回值將會(huì)是空,一個(gè)特定的錯(cuò)誤將會(huì)作為替代(簡(jiǎn)單來說埂息,就是原本應(yīng)有的返回值是空的技潘,取而代之的是返回一個(gè)錯(cuò)誤)。否則耿芹,函數(shù)返回的崭篡,是一個(gè)包含了其返回值的可選類型的值(這里就需要拆包了)。例:
這里 try 和 吧秕? 間不能有空格。try迹炼?先運(yùn)行函數(shù)砸彬,如果代碼沒有拋出錯(cuò)誤,那么try斯入?的結(jié)果就是函數(shù)的返回值砂碉,不然try?的結(jié)果是nil刻两。之所以是nil增蹭,而不是error,原因是error是函數(shù)拋出的磅摹,意味著函數(shù)并沒有return任何東西滋迈。?表示的户誓,是嘗試運(yùn)行的函數(shù)饼灿,有或者沒有返回值。
使用 defer 來寫一個(gè)block帝美,這個(gè)block在函數(shù)所有代碼之后碍彭,函數(shù)返回前執(zhí)行(也就是說,不管你把block放在哪里,他都會(huì)在return前面執(zhí)行)庇忌。不論函數(shù)是否拋出錯(cuò)誤舞箍,這段block代碼都會(huì)執(zhí)行。你可以使用 defer 來把創(chuàng)建代碼(setup code)和清理代碼(cleanup code)寫在一塊兒皆疹,即便他們要在不同的時(shí)間執(zhí)行疏橄。例: