Swif之異常處理

異常處理:

一、引入

二、異常表示

三、異常處理-4種方式

四、指定清理操作

涉及關(guān)鍵字:Error throw throws try do catch

引入

比如你設(shè)計的程序需要讀取電腦中的某個文件,以下代碼當訪問文件出現(xiàn)問題時,當前沒法清楚的描述異常,無法定位錯誤的原因。所以如何來描述異常呢?

```

func readFileContent(filePath : String) -> String? {

? ? // 1.filePath為""

? ? if filePath == "" {

? ? ? ? return nil

? ? }

? ? // 2.filepath有值,但是沒有對應(yīng)的文件

? ? if filePath != "/User/Desktop/123.plist" {

? ? ? ? return nil

? ? }

? ? // 3.取出其中的內(nèi)容

? ? return "123"

}

readFileContent(filePath: "abc")

```

描述異常

參考官網(wǎng)

在Swift里,錯誤用遵循 Error 協(xié)議的類型的值來表示;

Error是一個空的protocol,它唯一的功能,就是告訴Swift編譯器,某個類型用來表示一個錯誤。

通常,我們使用一個enum來定義各種錯誤的可能性

拋出一個錯誤用throw

通過合理定義異常,改進上述代碼

```

// 1.定義異常

enum FileReadError : Error {

? ? case FileISNull

? ? case FileNotFound

}

// 2.改進方法,讓方法拋出異常

func readFile(filePath : String) throws -> String {

? ? // 1.filePath為""

? ? if filePath == "" {

? ? ? ? throw FileReadError.FileISNull

? ? }

? ? // 2.filepath有值,但是沒有對應(yīng)的文件

? ? if filePath != "/User/Desktop/123.plist" {

? ? ? ? throw FileReadError.FileNotFound

? ? }

? ? // 3.取出其中的內(nèi)容

? ? return "123"

}

```

異常處理

拋出異常后,也就是異常出現(xiàn)后,怎么處理呢?

用throwing 函數(shù)傳遞錯誤

try?方式

最終返回結(jié)果為一個可選類型。如果出現(xiàn)了異常,則返回一個nil.沒有異常,則返回對應(yīng)的值——》不處理異常

try!方式

告訴系統(tǒng)該方法沒有異常,一旦如果出現(xiàn)了異常,則程序會直接崩潰

do catch(建議)

```

var result = try? readFile(filePath: "abc")

var result = try! readFile(filePath: "abc")

do{

? ? try readFile(filePath: "abc")

}catch{//內(nèi)置變量error

? ? print(error)

}

```

指定清理

在java中,我們處理異常使用 try catch finally 。不管有沒有出錯,我們一般把必須要執(zhí)行的代碼放在finally里。比較典型的一個場景是數(shù)據(jù)庫的操作,不管是否操作成功,最后要close 釋放資源。

在swift中,如果想要defer語句來實現(xiàn)。

defer語句調(diào)用時機:將離開當前代碼塊時執(zhí)行,可以用它在異常中進行掃尾工作,比如關(guān)閉IO流,釋放資源等

案例一:掌握defer執(zhí)行時機

```

do{

? defer{

? ? ? print("釋放資源11")

? ? ? print("釋放資源12")

? }

? print("test1")

? try readFile(filePath: "/User/Desktop/123.plist") //如果路徑為空,執(zhí)行順序如何?

? print("test2")

}catch{//內(nèi)置變量error

? print(error)

}

```

案例二:多個defer語句執(zhí)行順序

```

do{

? ? defer{

? ? ? ? print("釋放資源11")

? ? ? ? print("釋放資源12")

? ? ? ? print("釋放資源13")

? ? }

? ? defer{

? ? ? ? print("釋放資源21")

? ? }

? ? defer{

? ? ? ? print("釋放資源33")

? ? }

? ? try readFile(filePath: "/User/Desktop/123.plist")

}catch{//內(nèi)置變量error

? ? print(error)

}

```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 異常處理: 一、引入 二、異常表示 三、異常處理-4種方式 四、指定清理操作 涉及關(guān)鍵字:Error throw ...
    不甜的旺仔閱讀 125評論 0 0
  • 異常處理: 一、引入 比如你設(shè)計的程序需要讀取電腦中的某個文件,以下代碼當訪問文件出現(xiàn)問題時,當前沒法清楚的描述...
    吐個泡泡_e9f0閱讀 250評論 0 0
  • 來源:https://www.cnblogs.com/Qian123/p/5715402.html#_label0...
    Alex筆記閱讀 456評論 0 1
  • 我曾見過那女生三面,在夢里。 第一面 是在那個深夜 似乎很靜 適合靜思 她說 . ...
    一平啊啊啊閱讀 621評論 0 0
  • Git "C:\Program Files\Git\etc\bash.bashrc"中添加export LESSC...
    Giru閱讀 353評論 0 0

友情鏈接更多精彩內(nèi)容