swift異常處理

swift像其他編程語言一樣可以拋出異常并處理異常,本文就詳細(xì)說一下在swift中拋出并處理異常,swift
中的一些簡單異常可以用enum定義,注意這個枚舉要繼承一個空協(xié)議Error,比如下面的代碼:

enum FileReadError : Error {
  case FileIsNull
  case FileNotFound
}

這里定義了一個異常值的枚舉,接下來我們寫個函數(shù)使用這些異常值,能拋出異常的函數(shù)一定要在函數(shù)后面添加關(guān)鍵字throws,這種函數(shù)一般稱為throwing函數(shù),如果這個函數(shù)有返回值,那么throws要寫在返回值的前面,看下面的例子:

func readFileContent(_ filePath: String) throws -> String {
  //1.filePath為空
  if filePath == "" {
    throw FileReadError.FileIsNull
  }
  //2.filePath有值,但是沒有對應(yīng)的路徑
  if filePath != "/User/Desktop/haha" {
    throw FileReadError.FileNotFound
  }
  //3.取出其中內(nèi)容
  return "haha"
}

swift中有4中方法來處理錯誤:

  • 把錯誤傳遞給調(diào)用這個方法的代碼
  • 使用do-catch語句來處理這個錯誤
  • 把錯誤處理為一個可選值
  • 斷言這個錯誤不會出現(xiàn)

下面將逐一演示

1.使用拋出方法來傳遞錯誤
//拋出錯誤
func throwError(_ filePath: String) throws -> String {
  print("錯誤傳遞")
  try readFileContent(filePath)
  print("未傳遞錯誤")
  return "無錯誤"
}

throwError這個函數(shù)并沒有處理函數(shù)readFileContent返回的錯誤,而是將錯誤傳遞給了調(diào)用throwError函數(shù)的地方處理了

2.使用do-catch來捕獲異常并處理
func catchError(_ filePath: String) {
  do {
    print("捕獲錯誤")
    let result = try readFileContent(filePath)
    print("未捕獲到錯誤\(result)")
  } catch FileReadError.FileIsNull {
    print("filePath為空")
  } catch FileReadError.FileNotFound {
    print("filePath有值,但是沒有對應(yīng)的路徑")
  }
}

使用do-catch捕獲異常處理,在do的閉包里執(zhí)行會拋出異常的代碼,在catch分支里匹配異常處理異常

3.把錯誤處理成可選值

代碼示例如下

func buhuoError(_ filePath: String) {
  if let result = try? readFileContent(filePath) {
    print("可選值非空"+result)
  }
}

使用try?將異常轉(zhuǎn)換為可選值,在使用try?的過程中,如果有異常拋出,那么這個語句的值為nil

4.禁用錯誤傳遞

有時候我們知道一個能拋出錯誤的方法在運(yùn)行時間上不會拋出錯誤,在這種情況下,我們可以使用語句try!來禁止錯誤傳遞,并且封裝在斷言內(nèi),如果真的有錯誤拋出,那么程序會崩潰。
實例代碼如下:

func noError(_ filePath: String) {
  //如果方法`readFileContent`拋出異常,則程序會崩潰
  let result = try! readFileContent(filePath)
}

defer語句

使用defer語句在代碼執(zhí)行離開當(dāng)前代碼塊之前執(zhí)行一些語句。不管代碼執(zhí)行如何離開當(dāng)前代碼塊,不管是因為報錯、return或者break,defer中的語句都能讓我們做一些必要的清理。例如,可以使用defer語句來保證文件描述符被關(guān)閉和手動分配的內(nèi)存被釋放。

參考:【Swift 3.1】18 - 錯誤處理 (Error Handling)

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

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

  • 一.異常的介紹只要我們在編程,就一定要面對錯誤處理的問題。Swift在設(shè)計的時候就盡可能讓我們明確感知錯誤,明確處...
    透支未來閱讀 876評論 0 0
  • 本章將會介紹 自動引用計數(shù)的工作機(jī)制自動引用計數(shù)實踐類實例之間的循環(huán)強(qiáng)引用解決實例之間的循環(huán)強(qiáng)引用閉包引起的循環(huán)強(qiáng)...
    寒橋閱讀 1,045評論 0 0
  • 序言 對異常的正確處理能夠明確反映在代碼執(zhí)行中出現(xiàn)的問題,使得在接下來的debug快速定位問題所在的地方,提高de...
    nuclear閱讀 814評論 0 1
  • 我怕我會感動 卻又違背內(nèi)心
    我們不想要的閱讀 106評論 0 1
  • 剛回來的路上看下班后群里有個牛人分享,后來加我微信,源于自己認(rèn)識星爺和之前喜歡在群里分享慢慢有點(diǎn)影響力了,很多人都...
    碼字者閱讀 1,994評論 0 0

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