Swift2.0-異常處理(Exception handler)

Swift2.0-異常處理(Exception handler)


前言

關於咱們爲何要使用異常處理,請看百度百科爲咱們做出的描述,想要更詳細的資料請點這裏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

Demo

你能夠在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裏面,在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/ 本文版權歸做者和博客園共有,歡迎轉載,但須保留此段聲明,並給出原文連接,謝謝合做!

相關文章
相關標籤/搜索