關於咱們爲何要使用異常處理,請看百度百科爲咱們做出的描述,想要更詳細的資料請點這裏git
異常處理,英文名爲exceptional handling, 是代替日漸衰落的error code方法的新法,提供error code 所未能具體的優點。異常處理分離了接收和處理錯誤代碼。這個功能理清了編程者的思緒,也幫助代碼加強了可讀性,方便了維護者的閱讀和理解。 異常處理(又稱爲錯誤處理)功能提供了處理程序運行時出現的任何意外或異常狀況的方法。異常處理使用 try、catch 和 finally 關鍵字來嘗試可能未成功的操做,處理失敗,以及在過後清理資源。 異常處理,是編程語言或計算機硬件裏的一種機制,用於處理軟件或信息系統中出現的異常情況(即超出程序正常執行流程的某些特殊條件)。 它有功能強大的控制流語句,像`do`、`try`、`catch`、`guard`和`defer`。咱們可以使用這些關鍵字去操控咱們的代碼,更精確地執行咱們的代碼。
以上摘自百度百科:github
關聯,在Objective-C
中,異常處理通常都是使用NSError
類接收異常和拋出異常,使用方法像這樣編程
NSError *error = nil; NSString *string = [[NSString alloc] initWithContentsOfFile:@"filePath" encoding:NSUTF8StringEncoding error:&error]; if (error != nil) { // Exception handle NSLog(@"Erorr is %@", error); } // Code...
不得不說,Swift
的異常處理更爲優雅,下面會重點介紹。swift
你能夠在github
上下載這個示例Demo安全
咱們能夠構建本身的異常類型,它只是一個枚舉,遵循ErrorType
,像是這樣編程語言
enum MyErrorHandling: ErrorType { case error1 case error2 }
這裏值得一提的是,只有函數纔可以拋出異常。咱們須要在參數後和返回值前加上throws
關鍵字,並用guard
捕捉異常,用throw
拋出異常。函數
func myLoad(item: String?) throws -> String { guard let newItem = item else { throw MyErrorHandling.error1 } return newItem }
guard:
guard
必須與else
配合使用,只有當guard
審查的條件成立,guard
以後的代碼纔會執行,不然拋出異常。url
咱們使用do-try-catch
去獲取並處理異常code
do { try myLoad(nil) } catch { print("error") }
若是隻包含一個catch
語句,那麼全部的錯誤都會在這個catch
中執行,咱們可以捕抓其錯誤信息blog
do { try myLoad(nil) } catch let error as NSError { print(error) }
咱們在使用catch
時,它是可以進行模式匹配的,咱們可以進行更精準的錯誤匹配處理
do { try myLoad("test") } catch MyErrorHandling.error1 { print("error1") } catch MyErrorHandling.error2 { print("error2") }
若是咱們不須要捕抓錯誤,那麼咱們可使用try!
或try?
去執行該函數
try? myLoad(nil)
不建議使用
try!
,使用try?
會更加安全。由於若是當有錯誤捕抓到時,程序會直接崩潰
那麼咱們什麼時候須要使用到defer
?這裏使用官方的例子,好比咱們須要讀取某文件內容並處理,你須要打開這個文件,最後你須要關閉這個文件。當一切順利的時候,程序一直往下運行,文件也將會被關閉。那麼當中間出現一些錯誤呢?例如在某個環節執行失敗了,可是你依然是須要去關閉該文件,在此defer
就表現得很強大了。在這個例子中,咱們能夠把關閉文件的代碼放到defer
裏面,在defer
裏的代碼不管是函數執行成功或失敗都會被執行。
func myLoad(item: String?) throws -> String { defer { print("Handle 1") } defer { print("Handle 2") } guard let newItem = item else { throw MyErrorHandling.error1 } return newItem }
須要注意的是,
defer
語句能夠有多個,它們的執行順序是Handle 1
->Handle 2
。不難理解,它們的執行順序是先進後出的。
這裏再說一下,你能夠在github
上下載這個示例Demo
博文做者:GarveyCalvin
博文出處:http://www.cnblogs.com/GarveyCalvin/ 本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!