代碼的運行不少時候並不會徹底按照程序員的設想進行,編寫代碼時進行可控的異常處理機制是十分必要的。一般,對於一個特定的操做,程序員能夠定義一個繼承自ErrorType的枚舉來進行異常類型的描述,使用throw關鍵字來進行異常的拋出,示例代碼以下:javascript
//定義一個自定義的錯誤類型 enum MyError:ErrorType { case DesTroyError case NormalError case SimpleError } //進行異常的拋出 throw MyError.NormalError
函數能夠進行錯誤的傳遞,須要使用throws關鍵字來聲明這個函數可能會拋出錯誤,若是不如此聲明,則函數內部拋出的錯誤只能在函數內部解決,throws關鍵字標記的函數內部拋出的錯誤會被傳遞到調用函數的地方,開發者能夠在調用函數的地方捕獲到錯誤描述來作相應處理,示例以下:java
func MyFunc()throws -> Void { throw MyError.NormalError }
對於可能拋出異常的函數調用,開發者要麼在調用函數的地方捕獲處理這些異常,要麼使用try關鍵字將異常繼續拋出去,等待下一層捕獲者處理。異常的處理後面會介紹,繼續拋出異常示例以下:程序員
try MyFunc()
除了將錯誤繼續向上拋出以外,Swift還提供了3種處理異常的方式。函數
開發者可使用do-catch語句來捕獲異常,經過異常類型的判斷來分別作處理,示例代碼以下:spa
do{ try MyFunc() }catch MyError.DesTroyError{//將打印error1 print("error1") }catch MyError.NormalError{ print("error2") }catch MyError.SimpleError{ print("error3") }catch{//若是上面全部的catch都沒有捕獲 會走這個異常捕獲判斷 print("all") }
處理異常拋出的第2中方式是使用try?將異常映射爲Optional值,能夠簡單理解爲,對一個可能拋出異常的函數的調用,若是有異常拋出,則返回值爲nil,若是沒有,則函數順利執行,返回值爲其原返回值,示例以下:code
//將返回nil try? MyFunc()
注意:返回值爲Void並不是爲nil,結合if-let語句能夠編寫十分飄逸的代碼,示例以下:orm
if let _=try?MyFunc() { print("success") }else{ print("fail") }
有時候開發者能夠保證一個可能拋出異常的函數絕對不會拋出異常,這時開發者可使用try!的方式來終止異常的傳遞,可是這樣作有必定風險,若是這個函數真的拋出了異常,則會產生運行時錯誤。示例以下:繼承
try! MyFunc()
對於某些釋放資源類的操做,開發者老是但願其離開當前代碼塊時被執行,而後一個複雜流程結構可能會因異常拋出,return,break這些方式被終止,所以,Swift中提供了defer語句來進行延時執行一些操做,defer中的語句老是會在當前代碼塊將要結束時才執行,不管它是以哪一種方式結束的,示例以下:ip
//執行此函數將打印 /* Care finish */ func MyFunc()throws -> Void { defer{ print("finish") } print("Care") throw MyError.DesTroyError }
專一技術,熱愛生活,交流技術,也作朋友。資源
——琿少 QQ羣:203317592