Swift之錯(cuò)誤處理

異常處理:
一、引入
二、異常表示
三、異常處理-4種方式
四、指定清理操作
涉及關(guān)鍵字:Error throw throws try do catc

引入

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

 func readFileContent(filePath : String) -> String? {
     // 1.filePath為""
     if filePath == "" {
         return nil
     }

     // 2.filepath有值,但是沒有對(duì)應(yīng)的文件
     if filePath != "/User/Desktop/123.plist" {
         return nil
     }

     // 3.取出其中的內(nèi)容
     return "123"
 }

 readFileContent(filePath: "abc")

描述異常

參考官網(wǎng)
在Swift里,錯(cuò)誤用遵循 Error 協(xié)議的類型的值來表示;
Error是一個(gè)空的protocol,它唯一的功能,就是告訴Swift編譯器,某個(gè)類型用來表示一個(gè)錯(cuò)誤。
通常,我們使用一個(gè)enum來定義各種錯(cuò)誤的可能性
拋出一個(gè)錯(cuò)誤用throw
通過合理定義異常,改進(jìn)上述代碼

// 1.定義異常
enum FileReadError : Error {
    case FileISNull
    case FileNotFound
}

// 2.改進(jìn)方法,讓方法拋出異常
func readFile(filePath : String) throws -> String {
    // 1.filePath為""
    if filePath == "" {
        throw FileReadError.FileISNull
    }
    // 2.filepath有值,但是沒有對(duì)應(yīng)的文件
    if filePath != "/User/Desktop/123.plist" {
        throw FileReadError.FileNotFound
    }
    // 3.取出其中的內(nèi)容
    return "123"
}

異常處理

拋出異常后,也就是異常出現(xiàn)后,怎么處理呢?
用throwing 函數(shù)傳遞錯(cuò)誤
try?方式
最終返回結(jié)果為一個(gè)可選類型。如果出現(xiàn)了異常,則返回一個(gè)nil.沒有異常,則返回對(duì)應(yīng)的值——》不處理異常
try!方式
告訴系統(tǒng)該方法沒有異常,一旦如果出現(xiàn)了異常,則程序會(huì)直接崩潰
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 。不管有沒有出錯(cuò),我們一般把必須要執(zhí)行的代碼放在finally里。比較典型的一個(gè)場景是數(shù)據(jù)庫的操作,不管是否操作成功,最后要close 釋放資源。
在swift中,如果想要defer語句來實(shí)現(xiàn)。
defer語句調(diào)用時(shí)機(jī):將離開當(dāng)前代碼塊時(shí)執(zhí)行,可以用它在異常中進(jìn)行掃尾工作,比如關(guān)閉IO流,釋放資源等
案例一:掌握defer執(zhí)行時(shí)機(jī)

do{
   defer{
       print("釋放資源11")
       print("釋放資源12")
   }
   print("test1")
   try readFile(filePath: "/User/Desktop/123.plist") //如果路徑為空,執(zhí)行順序如何?
   print("test2")
}catch{//內(nèi)置變量error
   print(error)
}

案例二:多個(gè)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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 異常處理: 關(guān)鍵字: throws、throw、 try、 try?、 try!、 do-catch、defer ...
    迷兔兔_閱讀 1,310評(píng)論 0 0
  • 本章將會(huì)介紹 自動(dòng)引用計(jì)數(shù)的工作機(jī)制自動(dòng)引用計(jì)數(shù)實(shí)踐類實(shí)例之間的循環(huán)強(qiáng)引用解決實(shí)例之間的循環(huán)強(qiáng)引用閉包引起的循環(huán)強(qiáng)...
    寒橋閱讀 1,044評(píng)論 0 0
  • 案例代碼下載 錯(cuò)誤處理 錯(cuò)誤處理是響應(yīng)程序中的錯(cuò)誤條件并從中恢復(fù)的過程。Swift為在運(yùn)行時(shí)拋出,捕獲,傳播和操縱...
    酒茶白開水閱讀 502評(píng)論 0 0
  • 我對(duì)input的理解: 的本質(zhì)就是: p標(biāo)簽和form標(biāo)簽不能嵌套
    劉葉青閱讀 133評(píng)論 0 0
  • 榮格說過:「孤獨(dú)的真正原因,是一個(gè)人無法與他人交流自己重要的感受?!谷欢聠胃陋?dú)常被劃分為兩件事,不清楚榮格想說...
    葉夏閱讀 155評(píng)論 0 0

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