《從零開始學Swift》學習筆記(Day 53)——do-try-catch錯誤處理模式

智捷關東昇發表於2016-03-25

原創文章,歡迎轉載。轉載請註明:關東昇的部落格

  Swift 1.x的錯誤處理模式存在很多弊端,例如:為了在程式設計時候省事,給error引數傳遞一個nil,或者方法呼叫完成後不去判斷error是否為nil,不進行錯誤處理。

let contents = NSString(contentsOfFile: filePath, 
                encoding: NSUTF8StringEncoding, error: nil)//error引數傳遞一個nil

或者

var err: NSError?    

let contents = NSString(contentsOfFile: filePath, encoding: NSUTF8StringEncoding, error: &err)

  不好的程式設計習慣,由於Objective-C和Swift 1.x沒有強制處理機制,因此一旦真的發生錯誤,程式就會發生崩潰。
  同樣的從檔案中讀取字串示例,如果使用Swift 2錯誤處理模式程式碼如下:

import Foundation

do {                //要做一些操作
    let str = try NSString(contentsOfFile: filePath, 
                                            encoding: NSUTF8StringEncoding)    //要嘗試做的事情
} catch let err as NSError {    //如果失敗則進入catch程式碼塊
    err.description

}

  do-try-catch這種錯誤模式與Java中異常處理機制非常類似,本意就是嘗試(try)做一件事情,如果失敗則捕獲(catch)處理。

捕獲錯誤
  完整的do-try-catch錯誤處理模式的語法如下:

do {
      try 語句
  成功處理語句組 
} catch 匹配錯誤 {
    錯誤處理語句組

}

  在try 語句中可以產生錯誤,當然也可能不會產生錯誤,如果有錯誤發生,catch就會處理錯誤。catch程式碼塊可以有多個,錯誤由哪個catch程式碼塊處理是由catch後面的錯誤匹配與否而定的。錯誤型別的多少就決定了catch可以有多少。我們先介紹一下錯誤型別。

錯誤型別
  在Swift中錯誤型別必須遵從ErrorType 協議,其次考慮到錯誤型別的匹配,它應該被設計成為列舉型別,列舉型別非常適合將一組相關值關聯起來。
如果我們編寫訪問資料庫表程式,實現對錶資料插入、刪除、修改和查詢等操作,我們會需要類似如下程式碼的錯誤型別:

enum DAOError: ErrorType {
    case NoData
    case PrimaryKeyNull

}

  NoData表示沒有資料情況,PrimaryKeyNull表示表的主鍵(Primary Key)為空情況。
那麼我們就可以通過如下程式碼捕獲錯誤。

do {    
    //try 訪問資料表函式或方法
} catch DAOError.NoData {
    print("沒有資料。")
} catch DAOError.PrimaryKeyNull {
    print("主鍵為空。")
}

歡迎關注關東昇新浪微博@tony_關東昇。 關注智捷課堂微信公共平臺,瞭解最新技術文章、圖書、教程資訊

enter image description here

更多精品iOS、Cocos、移動設計課程請關注智捷課堂官方網站:http://www.zhijieketang.com 智捷課堂論壇網站:http://51work6.com/forum.php

相關文章